Формы столкновений (3D)

В этом руководстве объясняется:

  • Типы форм столкновений, доступных в 3D в Godot.

  • Использование convex или concave мешей как формы столкновения.

  • Вопросы производительности в отношении 3D-столкновений.

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

Вы можете определить форму PhysicsBody3D, добавив один или несколько CollisionShape3Ds в качестве прямых дочерних узлов. Косвенные дочерние узлы (т. е. дочерние элементы дочерних узлов) будут игнорироваться и не будут использоваться в качестве форм столкновений. Также обратите внимание, что необходимо добавить ресурс Shape3D к узлам формы столкновения в доке инспектора.

Примечание

При добавлении нескольких фигур столкновений к одному PhysicsBody вам не нужно беспокоиться об их наложении. Они не будут "сталкиваться" друг с другом.

Примитивные формы столкновений

Godot предоставляет следующие примитивные типы форм столкновений:

Столкновение большинства небольших объектов можно представить с помощью одной или нескольких примитивных фигур. Однако для более сложных объектов, таких как большой корабль или целый уровень, вам могут понадобиться выпуклые или вогнутые формы. Подробнее об этом ниже.

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

Выпуклые формы столкновений

Convex collision shapes представляют собой компромисс между примитивными формами коллизий и вогнутыми формами коллизий. Они могут представлять фигуры любой сложности, но с важным ограничением. Как следует из названия, отдельная форма может представлять только выпуклую форму. Например, пирамида — выпуклая, а полый параллелепипед — вогнутая. Чтобы определить вогнутый объект с помощью одной формы коллизий, необходимо использовать вогнутую форму коллизий.

В зависимости от сложности объекта, можно добиться лучшей производительности, используя несколько выпуклых фигур вместо вогнутой формы столкновения. Godot позволяет использовать выпуклое разложение для генерации выпуклых фигур, приблизительно соответствующих полому объекту. Обратите внимание, что это преимущество в производительности теряет силу после определённого количества выпуклых фигур. Для больших и сложных объектов, таких как целый уровень, мы рекомендуем использовать вогнутые фигуры.

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

  • Создание одного выпуклого столкновительного узла использует алгоритм Quickhull. Он создаёт один узел CollisionShape с автоматически сгенерированной выпуклой формой столкновения. Поскольку генерируется только одна форма, он обеспечивает хорошую производительность и идеально подходит для небольших объектов.

  • Создание нескольких выпуклых коллизионных сестринских элементов использует алгоритм V-HACD. Он создаёт несколько узлов CollisionShape, каждый из которых имеет выпуклую форму. Поскольку он генерирует несколько форм, он точнее для вогнутых объектов, но снижает производительность. Для объектов средней сложности этот алгоритм, вероятно, будет быстрее, чем использование одной вогнутой формы коллизии.

Вогнутые или тримешевые формы столкновений

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

Примечание

Несмотря на то, что вогнутые формы обеспечивают наиболее точное столкновение, сообщение о контакте может быть менее точным, чем у примитивных форм.

Если GridMaps не используются для дизайна уровней, вогнутые формы — лучший подход к коллизиям. Однако, если на вашем уровне есть мелкие детали, вы можете исключить их из коллизий для повышения производительности и улучшения игрового процесса. Для этого можно создать упрощённую сетку коллизий в 3D-моделере и позволить Godot автоматически сгенерировать для неё форму коллизий. Подробнее об этом ниже

Обратите внимание, что, в отличие от примитивных и выпуклых фигур, вогнутая форма столкновения не имеет фактического «объёма». Вы можете размещать объекты как снаружи фигуры, так и внутри неё.

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

  • Создать статическое тело Trimesh — удобный вариант. Он создаёт StaticBody, содержащее вогнутую форму, соответствующую геометрии сетки.

  • Создать Trimesh Collision Sibling создает узел CollisionShape с вогнутой формой, соответствующей геометрии сетки.

См. также

Информацию о том, как экспортировать модели для Godot и автоматически генерировать формы столкновений при импорте, см. в Импорт 3D сцен.

Предостережения относительно производительности

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

При использовании одной непреобразованной формы столкновения в StaticBody алгоритм движка широкой фазы может отбрасывать неактивные PhysicsBodies. В этом случае узкая фаза будет учитывать только формы активных тел. Если StaticBody имеет несколько форм столкновения, широкая фаза не сработает. Узкая фаза, которая медленнее, должна выполнить проверку столкновения для каждой формы.

Если у вас возникнут проблемы с производительностью, вам, возможно, придётся пойти на компромиссы в плане точности. В большинстве игр столкновения не всегда точны. Разработчики находят изощрённые способы скрыть их или сделать незаметными в обычном игровом процессе.