physics-shapes.md 9.1 KB


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

brief: Объект столкновения может использовать несколько геометрических примитивов в качестве формы или одну сложную форму.

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

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

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

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

Add a primitive shape

Форма Box

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

Box shape

Форма Sphere

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

Sphere shape

Форма Capsule

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

Sphere shape

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

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

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

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

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

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

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

Tilesource collision

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

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

Defold предоставляет возможность создавать выпуклую форму (convex hull shape) из трёх или более точек.

  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)

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

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

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

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

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

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

Отладка

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