Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

Формы столкновения

Объект столкновения может содержать несколько встроенных форм. В 3D-физике среди них могут быть выпуклые оболочки и треугольные сетки из файлов glTF или GLB. Также можно использовать ресурс тайловой карты или выпуклой формы через свойство Collision Shape объекта столкновения.

Примитивные формы

Примитивные формы — это Box, Sphere и Capsule. Добавить примитивную форму можно выполнив клик ПКМ на объекте столкновения и выбрав Add Shape:

Add a primitive shape

Форма Box

У бокса есть позиция, вращение и размеры (ширина, высота и глубина):

Box shape

Форма Sphere

У сферы есть позиция, вращение и диаметр:

Sphere shape

Форма Capsule

У капсулы есть позиция, вращение, диаметр и высота:

Sphere shape

Форма капсулы поддерживается только при использовании 3D физики (настраивается в секции Physics файла game.project).

Комплексные формы

Сложные формы могут использовать геометрию тайловой карты или данные выпуклой оболочки. Начиная с Defold 1.13.2, 3D-объекты столкновения также могут создавать формы в виде выпуклых оболочек и треугольных сеток из сеток в сценах glTF или GLB.

Формы Hull и Mesh в 3D

Используйте форму Hull для выпуклого приближения сетки или форму Mesh, когда столкновения должны следовать её треугольникам, включая вогнутые участки, например проёмы в геометрии уровня.

  1. Установите Physics → Type в 3D в файле game.project.
  2. Щёлкните правой кнопкой мыши по объекту столкновения в Outline и выберите Add Shape ▸ Hull или Add Shape ▸ Mesh.
  3. Выберите новую форму и задайте файл .gltf или .glb в её свойстве Scene.
  4. Выберите именованную сетку в поле Mesh. Если её нет в списке, задайте имя сетке в программе моделирования и экспортируйте сцену заново.
  5. Переместите и поверните форму, чтобы совместить её с видимой геометрией игрового объекта. При необходимости повторите эти шаги, чтобы добавить другие формы.

Выбранная сетка предоставляет локальную геометрию; трансформации узлов glTF не применяются. Формы столкновения Mesh поддерживаются реализацией Bullet 3D, в том числе для статических и нестатических объектов столкновения. В реализациях 2D-физики они не поддерживаются.

Геометрия треугольной сетки доступна в API форм во время выполнения только для чтения. Чтобы изменить её треугольники, отредактируйте исходную сетку и пересоберите проект. О масштабе игрового объекта см. в разделе Масштабирование форм столкновения.

Форма столкновения из тайловой карты

В Defold встроена функция, позволяющая легко генерировать физические формы для источника тайлов, используемого тайловой картой. Руководство по источникам тайлов объясняет как добавлять группы столкновений в источник тайлов и назначать тайлы группе столкновений (пример).

Чтобы добавить столкновение к тайловой карте:

  1. Добавьте тайловую карту игровому объекту кликнув ПКМ на игровом объекте и выбрав Add Component File. Выберите файл тайловой карты.
  2. Добавьте объект столкновения кликнув ПКМ на игровом объекте и выбрав Add Component ▸ Collision Object.
  3. Вместо добавления форм компоненту столкновений, задайте в качестве значения свойства Collision Shape файл тайловой карты
  4. Как обычно, задайте свойства объекта столкновения.

Tilesource collision

Учтите, что свойство Group не учитывается в таком случае, так как группы столкновений задаются в источнике тайлов соответствующей тайловой карты.

Выпуклые формы

В 3D-физике можно создавать выпуклую оболочку непосредственно из сетки, используя описанный выше процесс в редакторе. Прежний ресурс .convexshape также поддерживается; его можно создать из точек с помощью внешнего редактора:

  1. Создайте файл выпуклой формы (расширение файла — .convexshape) с помощью внешнего редактора.
  2. Отредактируйте файл вручную, используя текстовый редактор или внешний инструмент (см. ниже).
  3. Вместо добавления форм в компонент столкновений, укажите файл выпуклой формы в свойстве Collision Shape.

Формат файла

Формат выпуклой формы использует тот же формат данных, что и все другие файлы Defold — protobuf в текстовом виде. Выпуклая форма задаётся набором точек. В 2D физике точки должны быть указаны в порядке против часовой стрелки. В 3D режиме используется абстрактное облако точек. Пример для 2D:

shape_type: TYPE_HULL
data: 200.000
data: 100.000
data: 0.0
data: 400.000
data: 100.000
data: 0.0
data: 400.000
data: 300.000
data: 0.0
data: 200.000
data: 300.000
data: 0.0

Пример выше описывает четыре угла прямоугольника:

 200x300   400x300
    4---------3
    |         |
    |         |
    |         |
    |         |
    1---------2
 200x100   400x100

Внешние инструменты

Существует несколько внешних инструментов, которые можно использовать для создания форм столкновения:

  • Physics Editor от CodeAndWeb позволяет создавать игровые объекты со спрайтами и соответствующими формами столкновения.
  • Defold Polygon Editor позволяет создавать выпуклые формы.
  • Physics Body Editor также может использоваться для создания выпуклых форм.

Масштабирование форм столкновения

Объект столкновения и его формы наследуют масштаб игрового объекта. Чтобы отключить это поведение, отключите опция Allow Dynamic Transforms в секции Physics файла game.project. Учтите, что поддерживается только равномерное масштабирование, а также то, что будет применено наименьшее значение масштабирования, если было задано не равномерное масштабирование.

Изменение размеров форм столкновения

Размеры примитивных форм можно изменять во время выполнения с помощью функции physics.set_shape(). Эта функция не заменяет вершины выпуклой оболочки или геометрию треугольной сетки. Пример:

-- установка параметров капсулы
local capsule_data = {
  type = physics.SHAPE_TYPE_CAPSULE,
  diameter = 10,
  height = 20,
}
physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)

-- установка параметров сферы
local sphere_data = {
  type = physics.SHAPE_TYPE_SPHERE,
  diameter = 10,
}
physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)

-- установка параметров коробки
local box_data = {
  type = physics.SHAPE_TYPE_BOX,
  dimensions = vmath.vector3(10, 10, 5),
}
physics.set_shape("#collisionobject", "my_box_shape", box_data)

Форма нужного типа с указанным идентификатором должна уже существовать на объекте столкновения.

Вращение форм столкновения

Вращение форм столкновения в 3D физике

Формы столкновения в 3D-физике могут поворачиваться вокруг всех осей.

Вращение форм столкновения в 2D физике

Формы столкновения в 2D физике могут поворачиваться только вокруг оси z. Вращение вокруг осей X или Y выльется в некорректные результаты и его стоит избегать, даже когда происходит вращение на 180 градусов для фактически переворота формы вокруг оси X или Y. Для переворота физической формы рекомендуется использовать physics.set_hlip(url, flip) и physics.set_vlip(url, flip).

Отладка

Вы можете включить отладку физики, чтобы видеть формы столкновений во время выполнения.