Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Форми зіткнення (3D)

Цей посібник пояснює:

  • Типи фігур зіткнення, доступні в 3D у Godot.

  • Використання опуклої або увігнутої сітки як форми зіткнення.

  • Зауваження продуктивності щодо тривимірних зіткнень.

Godot надає багато видів колізійних форм із різною продуктивністю та точністю.

Ви можете визначити форму class_PhysicsBody3D, додавши один або кілька CollisionShape3Ds як прямі дочірні вузли. Непрямі дочірні вузли (тобто діти дочірніх вузлів) ігноруватимуться та не використовуватимуться як форми зіткнень. Також зауважте, що ви повинні додати class_Shape3D ресурс до вузлів форми зіткнення в доці Inspector.

Примітка

Коли ви додаєте кілька форм зіткнення до одного PhysicsBody, вам не потрібно турбуватися про те, що вони накладаються. Вони не будуть «зіткнутися» один з одним.

Примітивні форми зіткнення

Godot надає наступні типи примітивних форм зіткнення:

Ви можете представити зіткнення більшості менших об’єктів за допомогою однієї або кількох простих форм. Однак для більш складних об'єктів, таких як великий корабель або цілий рівень, вам можуть знадобитися опуклі або увігнуті форми. Детальніше про це нижче.

Ми рекомендуємо віддавати перевагу примітивним формам для динамічних об’єктів, таких як RigidBodies і CharacterBodies, оскільки їх поведінка є найбільш надійною. Вони також часто забезпечують кращу продуктивність.

Опуклі форми зіткнення

Convex collision shapes є компромісом між примітивними формами зіткнення та увігнутими формами зіткнення. Вони можуть представляти фігури будь-якої складності, але з важливим застереженням. Як випливає з назви, окрема фігура може представляти лише опуклу форму. Наприклад, піраміда опукла, а порожниста коробка увігнута. Щоб визначити увігнутий об’єкт з єдиною формою зіткнення, потрібно використовувати увігнуту форму зіткнення.

Залежно від складності об’єкта, ви можете отримати кращу продуктивність, використовуючи кілька опуклих форм замість увігнутої форми зіткнення. Godot дозволяє використовувати опукле розкладання для створення опуклих форм, які приблизно відповідають порожнистому об’єкту. Зауважте, що ця перевага продуктивності більше не застосовується після певної кількості опуклих форм. Для великих і складних об’єктів, таких як цілий рівень, ми рекомендуємо замість цього використовувати увігнуті форми.

Ви можете створити одну або кілька опуклих форм зіткнення з редактора, вибравши MeshInstance3D і скориставшись меню Mesh у верхній частині вікна тривимірного перегляду. Редактор пропонує два режими генерації:

  • Створення єдиного опуклого зіткнення-брата використовує алгоритм Quickhull. Він створює один вузол CollisionShape із автоматично згенерованою опуклою формою зіткнення. Оскільки він створює лише одну форму, він забезпечує хорошу продуктивність і ідеально підходить для невеликих об’єктів.

  • Створити кілька опуклих братів і сестер використовує алгоритм V-HACD. Він створює кілька вузлів CollisionShape, кожен з яких має опуклу форму. Оскільки він генерує кілька форм, він більш точний для увігнутих об’єктів за рахунок продуктивності. Для об’єктів середньої складності це, швидше за все, буде швидше, ніж використання однієї увігнутої форми зіткнення.

Увігнуті або трійчасті форми зіткнення

Concave collision shapes, які також називають трисітковими фігурами зіткнень, можуть мати будь-яку форму, від кількох трикутників до тисяч трикутників. Увігнуті форми є найповільнішим варіантом, але також найточнішим у Godot. Ви можете використовувати лише увігнуті фігури в StaticBodies. Вони не працюватимуть із CharacterBodies або RigidBodies, якщо для RigidBody не встановлено режим Static.

Примітка

Незважаючи на те, що увігнуті форми забезпечують найточнішу колізію, звіти про контакти можуть бути менш точними, ніж примітивні форми.

Якщо не використовувати GridMaps для проектування рівнів, увігнуті форми є найкращим підходом для зіткнення рівнів. Тим не менш, якщо ваш рівень має дрібні деталі, ви можете виключити їх із зіткнення для продуктивності та відчуття гри. Для цього ви можете побудувати спрощену сітку зіткнень у програмі 3D-моделювання, а Godot згенерувати для неї форму зіткнень автоматично. Детальніше про це нижче

Зауважте, що на відміну від примітивних і опуклих форм, увігнута форма зіткнення не має фактичного «об’єму». Ви можете розміщувати об’єкти як зовні фігури, так і всередині.

Ви можете створити увігнуту форму зіткнення з редактора, вибравши MeshInstance3D і скориставшись меню Mesh у верхній частині тривимірного вікна перегляду. Редактор пропонує два варіанти:

  • Створити статичне тіло Trimesh є зручним варіантом. Він створює StaticBody, що містить увігнуту форму, що відповідає геометрії сітки.

  • Create Trimesh Collision Sibling створює вузол CollisionShape із увігнутою формою, яка відповідає геометрії сітки.

Дивись також

Перегляньте Імпортування 3D сцен інформацію про те, як експортувати моделі для Godot і автоматично генерувати форми зіткнень під час імпорту.

Застереження щодо продуктивності

Ви не обмежені однією формою зіткнення на PhysicsBody. Тим не менш, ми рекомендуємо зберігати якомога меншу кількість форм, щоб покращити продуктивність, особливо для динамічних об’єктів, таких як RigidBodies і CharacterBodies. Крім того, уникайте перекладу, обертання або масштабування CollisionShapes, щоб скористатися перевагами внутрішньої оптимізації фізичного механізму.

У разі використання однієї нетрансформованої форми зіткнення в StaticBody алгоритм широкої фази двигуна може відкидати неактивні PhysicsBodies. Тоді вузька фаза повинна буде враховувати лише форми активних тіл. Якщо StaticBody має багато форм зіткнення, широка фаза не вдасться. Вузька фаза, яка є повільнішою, повинна виконати перевірку на зіткнення з кожною формою.

Якщо у вас виникли проблеми з продуктивністю, вам, можливо, доведеться піти на компроміси щодо точності. Більшість ігор не мають 100% точного зіткнення. Вони знаходять творчі способи приховати це або іншим чином зробити непомітним під час звичайної гри.