title: Формы столкновения
Объект столкновения может использовать несколько геометрических примитивов в качестве формы или одну сложную форму.
Примитивные формы --- это Box, Sphere и Capsule. Добавить примитивную форму можно выполнив клик ПКМ на объекте столкновения и выбрав Add Shape:
У бокса есть позиция, вращение и размеры (ширина, высота и глубина):
У сферы есть позиция, вращение и диаметр:
У капсулы есть позиция, вращение, диаметр и высота:
::: important Форма капсулы поддерживается только при использовании 3D физики (настраивается в секции Physics файла game.project). :::
Сложная форма может быть создана либо из компонента тайловой карты либо из выпуклой формы.
В Defold встроена функция, позволяющая легко генерировать физические формы для источника тайлов, используемого тайловой картой. Руководство по источникам тайлов объясняет как добавлять группы столкновений в источник тайлов и назначать тайлы группе столкновений (пример).
Чтобы добавить столкновение к тайловой карте:
::: important Учтите, что свойство Group не учитывается в таком случае, так как группы столкновений задаются в источнике тайлов соответствующей тайловой карты. :::
Defold предоставляет возможность создавать выпуклую форму (convex hull shape) из трёх или более точек.
.convexshape
) с помощью внешнего редактора.Формат выпуклой формы использует тот же формат данных, что и все другие файлы 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
Существует несколько внешних инструментов, которые можно использовать для создания форм столкновения:
Объект столкновения и его формы наследуют масштаб игрового объекта. Чтобы отключить это поведение, отключите опция 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-физике могут поворачиваться вокруг всех осей.
Формы столкновения в 2D физике могут поворачиваться только вокруг оси z. Вращение вокруг осей X или Y выльется в некорректные результаты и его стоит избегать, даже когда происходит вращение на 180 градусов для фактически переворота формы вокруг оси X или Y. Для переворота физической формы рекомендуется использовать physics.set_hlip(url, flip)
и physics.set_vlip(url, flip)
.
Вы можете включить отладку физики, чтобы видеть формы столкновений во время выполнения.