--- title: Формы столкновения brief: Объект столкновения может использовать несколько геометрических примитивов в качестве формы или одну сложную форму. --- # Формы столкновения Объект столкновения может использовать несколько геометрических примитивов в качестве формы или одну сложную форму. ### Примитивные формы Примитивные формы --- это *Box*, *Sphere* и *Capsule*. Добавить примитивную форму можно выполнив клик ПКМ на объекте столкновения и выбрав Add Shape: ![Add a primitive shape](images/physics/add_shape.png) ## Форма Box У бокса есть позиция, вращение и размеры (ширина, высота и глубина): ![Box shape](images/physics/box.png) ## Форма Sphere У сферы есть позиция, вращение и диаметр: ![Sphere shape](images/physics/sphere.png) ## Форма Capsule У капсулы есть позиция, вращение, диаметр и высота: ![Sphere shape](images/physics/capsule.png) ::: important Форма капсулы поддерживается только при использовании 3D физики (настраивается в секции Physics файла *game.project*). ::: ### Комплексные формы Сложная форма может быть создана либо из компонента тайловой карты либо из выпуклой формы. ## Форма столкновения из тайловой карты В Defold встроена функция, позволяющая легко генерировать физические формы для источника тайлов, используемого тайловой картой. [Руководство по источникам тайлов](/manuals/tilesource/#tile-source-collision-shapes) объясняет как добавлять группы столкновений в источник тайлов и назначать тайлы группе столкновений ([пример](/examples/tilemap/collisions/)). Чтобы добавить столкновение к тайловой карте: 1. Добавьте тайловую карту игровому объекту кликнув ПКМ на игровом объекте и выбрав Add Component File. Выберите файл тайловой карты. 2. Добавьте объект столкновения кликнув ПКМ на игровом объекте и выбрав Add Component ▸ Collision Object. 3. Вместо добавления форм компоненту столкновений, задайте в качестве значения свойства *Collision Shape* файл *тайловой карты* 4. Как обычно, задайте *свойства* объекта столкновения. ![Tilesource collision](images/physics/collision_tilemap.png) ::: 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](https://www.codeandweb.com/physicseditor/tutorials/how-to-create-physics-shapes-for-defold) от CodeAndWeb позволяет создавать игровые объекты со спрайтами и соответствующими формами столкновения. * [Defold Polygon Editor](https://rossgrams.itch.io/defold-polygon-editor) позволяет создавать выпуклые формы. * [Physics Body Editor](https://selimanac.github.io/physics-body-editor/) также может использоваться для создания выпуклых форм. # Масштабирование форм столкновения Объект столкновения и его формы наследуют масштаб игрового объекта. Чтобы отключить это поведение, отключите опция [Allow Dynamic Transforms](/manuals/project-settings/#allow-dynamic-transforms) в секции Physics файла *game.project*. Учтите, что поддерживается только равномерное масштабирование, а также то, что будет применено наименьшее значение масштабирования, если было задано не равномерное масштабирование. # Изменение размеров форм столкновения Формы объекта столкновения можно изменять во время выполнения с помощью функции `physics.set_shape()`. Пример: ```lua -- установка параметров капсулы 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)`](/ref/stable/physics/?#physics.set_hflip:url-flip) и [`physics.set_vlip(url, flip)`](/ref/stable/physics/?#physics.set_vflip:url-flip). # Отладка Вы можете [включить отладку физики](/manuals/debugging/#debugging-problems-with-physics), чтобы видеть формы столкновений во время выполнения.