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

Форми колізій

Об’єкт колізії (collision object) може містити кілька вбудованих форм. У 3D-фізиці до них можуть належати оболонки й трикутні сітки з файлів glTF або GLB. Також можна використати ресурс карти плиток або опуклої форми через властивість Collision Shape об’єкта колізії.

Примітивні форми

Примітивні форми — це прямокутний паралелепіпед, сфера та капсула. Щоб додати примітивну форму, клацніть правою кнопкою миші об’єкт колізії та виберіть Add Shape:

Додавання примітивної форми

Форма прямокутного паралелепіпеда

Прямокутний паралелепіпед має позицію, поворот і розміри (ширину, висоту та глибину):

Форма прямокутного паралелепіпеда

Форма сфери

Сфера має позицію, поворот і діаметр:

Форма сфери

Форма капсули

Капсула має позицію, поворот, діаметр і висоту:

Форма сфери

Форми капсули підтримуються лише під час використання 3D-фізики (налаштовується в розділі Physics файлу game.project).

Складні форми

Складні форми можуть використовувати геометрію карти плиток або дані опуклої оболонки. Починаючи з Defold 1.13.2, об’єкти колізій у 3D також можуть створювати оболонки й форми трикутних сіток із сіток у сценах glTF або GLB.

Форми оболонок і сіток у 3D

Використовуйте форму Hull для опуклого наближення сітки або форму Mesh, коли колізії мають відповідати її трикутникам, зокрема увігнутим ділянкам, як-от отворам у геометрії рівня.

  1. У game.project задайте для Physics → Type значення 3D.
  2. Клацніть правою кнопкою миші об’єкт колізії в Outline і виберіть Add Shape ▸ Hull або Add Shape ▸ Mesh.
  3. Виберіть нову форму й задайте для її властивості Scene файл .gltf або .glb.
  4. Виберіть іменовану сітку в полі Mesh. Якщо її немає в списку, надайте сітці назву у своєму засобі моделювання й експортуйте сцену знову.
  5. Змініть позицію й поворот форми, щоб сумістити її з видимою геометрією ігрового об’єкта. За потреби повторіть ці кроки, щоб додати інші форми.

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

Через API форм під час виконання геометрія трикутної сітки доступна лише для читання. Щоб змінити її трикутники, відредагуйте вихідну сітку й виконайте збирання знову. Про масштаб ігрового об’єкта дивіться в розділі Масштабування форм колізій.

Форма колізії карти плиток

Defold містить функцію, яка дає змогу легко генерувати фізичні форми для джерела плиток, що використовується картою плиток. У посібнику з джерел плиток пояснено, як додавати групи колізій до джерела плиток і призначати плитки групам колізій (приклад).

Щоб додати колізії до карти плиток:

  1. Додайте карту плиток до ігрового об’єкта (game object): клацніть правою кнопкою миші ігровий об’єкт і виберіть Add Component File. Виберіть файл карти плиток.
  2. Додайте компонент об’єкта колізії до ігрового об’єкта: клацніть правою кнопкою миші ігровий об’єкт і виберіть Add Component ▸ Collision Object.
  3. Замість додавання форм до компонента задайте файл карти плиток у властивості Collision Shape.
  4. Налаштуйте Properties компонента об’єкта колізії як зазвичай.

Колізії джерела плиток

Зауважте, що властивість 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(). Ця функція не замінює вершини оболонки або геометрію трикутної сітки. Приклад:

-- set capsule shape data
local capsule_data = {
  type = physics.SHAPE_TYPE_CAPSULE,
  diameter = 10,
  height = 20,
}
physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)

-- set sphere shape data
local sphere_data = {
  type = physics.SHAPE_TYPE_SPHERE,
  diameter = 10,
}
physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)

-- set box shape 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).

Налагодження

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