3D столкновения частиц

Столкновения частиц

Поскольку частицы GPU обрабатываются полностью на GPU, у них нет доступа к физическому миру игры. Если вам нужно, чтобы частицы сталкивались с окружающей средой, вам нужно настроить узлы particle collision (столкновений частиц). Их четыре: GPUParticlesCollisionBox3D, GPUParticlesCollisionSphere3D, GPUParticlesCollisionSDF3D и GPUParticlesCollisionHeightField3D.

Общие свойства

Общие свойства столкновений частиц

Общие свойства столкновений

Есть некоторые свойства, которые вы можете найти на всех узлах столкновений. Они находятся в разделе GPUParticlesCollision3D в инспекторе.

Свойство Cull Mask управляет тем, на какие системы частиц влияет узел столкновения на основе слоев видимости каждой системы. Система частиц сталкивается с узлом столкновения только в том случае, если хотя бы один из слоев видимости системы включен в маске отсечения коллайдера.

Предупреждение

Существует известная проблема со столкновением частиц GPU, которая мешает корректной работе маски отбраковки в Godot 4.0. Мы обновим документацию, как только она будет исправлена.

Кубическое столкновение

Кубическое столкновение частиц

Кубическое столкновение в списке узлов

Box collision nodes (Узлы столкновения коробок) имеют форму сплошного прямоугольного короба. Вы управляете их размером с помощью свойства Extents. Размеры коробок всегда измеряют половину сторон их границ, поэтому значение (X=1.0,Y=1.0,Z=1.0) создает коробки шириной 2 метра с каждой стороны. Узлы столкновения коробок полезны для моделирования геометрии пола и стен, с которыми должны сталкиваться частицы.

Чтобы создать узел box collision, добавьте новый дочерний узел в сцену и выберите GPUParticlesCollisionBox3D из списка доступных узлов. Вы можете анимировать положение box или прикрепить его к движущемуся узлу для получения более динамичных эффектов.

Кубическое столкновение с системами частиц

Две системы частиц сталкиваются с узлом box collision

Сферическое столкновение

Сферическое столкновение частиц

Sphere collision (Столкновение сфер) в списке узлов

Узлы столкновения сфер имеют форму сплошной сферы. Свойство Radius управляет размером сферы. В то время как узлы столкновения коробок не обязательно должны быть идеальными кубами, узлы столкновения сфер всегда будут сферами. Если вы хотите задать ширину независимо от высоты, вам нужно изменить свойство Scale (Шкала) в разделе Node3D.

Чтобы создать sphere collision node (узел столкновения сферы), добавьте новый дочерний узел в сцену и выберите GPUParticlesCollisionSphere3D из списка доступных узлов. Вы можете анимировать положение сферы или прикрепить ее к движущемуся узлу для получения более динамичных эффектов.

Столкновение сферы с системами частиц

Две системы частиц сталкиваются с узлом столкновения сферы

Столкновение с картой высот

Столкновение частиц с картой высот

Столкновение поля высоты в списке узлов

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

Чтобы создать узел столкновения поля высот, добавьте в сцену новый дочерний узел и выберите GPUParticlesCollisionHeightField3D из списка доступных узлов.

Узел столкновения поля высоты имеет форму коробки. Свойство Extents управляет его размером. Extents всегда измеряет половину сторон его границ, поэтому значение (X=1.0,Y=1.0,Z=1.0) создает коробку шириной 2 метра с каждой стороны. Все, что находится за пределами размеров узла, игнорируется при создании поля высоты.

Свойство Resolution управляет детализацией поля высоты. Более низкое разрешение работает быстрее за счет точности. Если разрешение поля высот слишком низкое, это может выглядеть так, будто частицы проникают в геометрию уровня или застревают в воздухе во время столкновений. Они также могут полностью игнорировать некоторые более мелкие сетки.

Разрешение поля высот

При низком разрешении при столкновении полей высот упускаются некоторые мелкие детали (слева)

Свойство Update Mode управляет тем, когда поле высоты воссоздается из сеток в пределах его границ. Установите его на When Moved (При перемещении), чтобы оно обновлялось только при перемещении. Это работает хорошо и подходит для статичных сцен, которые не очень часто меняются. Если вам нужно, чтобы частицы сталкивались с динамическими объектами, которые часто меняют положение, вы можете выбрать Always (Всегда), чтобы обновлять каждый кадр. Это влияет на производительность и должно использоваться только при необходимости.

Примечание

Важно помнить, что когда для параметра Update Mode установлено значение When Moved, именно height field node, перемещение которого запускает обновление. Поле высоты не обновляется, когда одна из ячеек внутри него перемещается.

Свойство Follow Camera Enabled заставляет поле высоты следовать за текущей камерой, если оно включено. Он будет обновляться при каждом движении камеры. Это свойство можно использовать, чтобы гарантировать, что вокруг игрока всегда происходит столкновение частиц, не теряя при этом производительности в областях, которые находятся вне поля зрения или слишком далеко.

SDF столкновения

Столкновение частиц с SDF

Столкновения SDF в списке узлов

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

Чтобы создать узел столкновения SDF, добавьте новый дочерний узел в сцену и выберите GPUParticlesCollisionSDF3D из списка доступных узлов. Узлы столкновения SDF должны быть запечены, чтобы иметь какое-либо влияние на частицы на уровне. Для этого нажмите кнопку Bake SDF на панели инструментов области просмотра, когда выбран узел столкновения SDF, и выберите каталог для хранения запеченных данных. Поскольку столкновение SDF должно быть запечено в редакторе, оно статично и не может изменяться во время выполнения.

Столкновение частиц с использованием SDF

Столкновение частиц SDF позволяет создавать очень подробные трехмерные формы столкновений

Узел коллизии SDF имеет форму коробки. Свойство Extents управляет его размером. Extents всегда измеряет половину сторон его границ, поэтому значение (X=1.0,Y=1.0,Z=1.0) создает коробку шириной 2 метра с каждой стороны. Все, что находится за пределами размеров узла, игнорируется для коллизии.

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

Сравнение разрешения

Одна и та же область, покрытая полем расстояний со знаком при разных разрешениях: 16 (слева) и 256 (справа)

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

Свойство Bake Mask управляет тем, какие сетки будут учитываться при запекании SDF. Только те сетки, которые отображаются на активных слоях в запекаемой маске, способствуют столкновению частиц.

Устранение неполадок

Для работы столкновения частиц visibility AABB частицы должны перекрываться с AABB коллайдера. Если столкновения не работают, несмотря на настройку коллайдеров, сгенерируйте обновленную видимость AABB, выбрав узел GPUParticles3D и выбрав GPUParticles3D > Generate Visibility AABB… в верхней части окна просмотра 3D-редактора.

Если частицы движутся быстро, а коллайдеры тонкие. Для этого есть два решения:

  • Сделайте коллайдеры толще. Например, если частицы не могут проникнуть ниже твердого пола, вы можете сделать коллайдер, представляющий пол, толще, чем его фактическое визуальное представление. Коллайдер поля высоты автоматически обрабатывает это по замыслу, так как поля высоты не могут представлять столкновение «комната над комнатой».

  • Увеличение Fixed FPS в узле GPUParticles3D позволит чаще выполнять проверки столкновений. Это приводит к снижению производительности, поэтому не устанавливайте слишком высокое значение.