This page has been translated automatically.
Видеоуроки
Интерфейс
Основы
Продвинутый уровень
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Профессиональный уровень (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Режимы вывода изображения
Физика
Браузер SDK 2
Лицензирование и типы лицензий
Дополнения (Add-Ons)
Демонстрационные проекты
API Samples
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Контроль версий
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Player-ноды
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
Унифицированный язык шейдеров UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Материалы и шейдеры
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Учебные материалы

Обнаружение столкновений

Движение тела без ограничений и препятствий в реальной жизни случается редко, то же самое и в виртуальном мире. Чтобы правильно описать ситуацию, когда тело встречает препятствие, используется обнаружение столкновения.

Алгоритмы обнаружения столкновений, независимо от их реализации, обычно работают с невидимыми упрощенными формами, которые аппроксимируют меши сталкивающихся объектов. Такие аппроксимации называются коллайдерами (или коллизионными формами). Есть несколько типов коллайдеров, которые можно комбинировать: кубы, сферы, цилиндры, капсулы, выпуклые многогранники.

В UNIGINE реализовано два типа коллизий в зависимости от типов сталкивающихся объектов:

  • Столкновение формы с формой: между двумя объектами с назначенными физическими свойствами (например, имеющими тело и хотя бы одну форму, оба должны быть включены). В этом случае обнаруживаются точки контакта между формами.
  • Столкновение формы с поверхностью: между объектом с назначенными физическими свойствами и нефизическим объектом (т. е. без физического представления). Если для поверхности включен флаг Collision, она также может пассивно участвовать в физическом взаимодействии и предотвращать прохождение физического объекта. В этом случае вычисляются точки контакта между формой и многоугольниками поверхности.
Внимание
Не масштабируйте меши, которые будут участвовать в обнаружении столкновений — физика не работает должным образом с масштабированными объектами. Чтобы избежать масштабирования, повторно импортируйте меш с требуемым масштабом.

Для того, чтобы объект участвовал в обнаружении столкновений (т.е. был коллайдером), он должен быть добавлен в конкретное BSP-дерево, представляющее физическую сцену. Обнаружение столкновений автоматически включается для объекта, если ему назначено тело или хотя бы одна из его поверхностей имеет включенный флаг Collision. Алгоритм включения / отключения обнаружения столкновений проиллюстрирован ниже.

Алгоритм включения / отключения обнаружения столкновений.
Примечание
  • При глобальном отключении моделирования физики обнаружение столкновений не отключается.
  • В случае, если объекту назначены и включены тело и форма, алгоритмы обнаружения столкновений будут использовать только параметры формы, а параметры его поверхностей будут проигнорированы.

Дополнительная информация#

Описание процесса#

Весь процесс разделен на следующие этапы и фазы:

  1. Обнаружение столкновений — на этом этапе мы обнаруживаем все столкновения со всеми точками контакта и собираем всю необходимую информацию.
  2. Реакция на столкновение — это результат столкновения (например, два шара отскакивают друг от друга). Без реакции не было бы разницы между столкновением и пересечением двух объектов. Трение, восстановление и другие параметры учитываются при расчете реакции на столкновение.

  3. Выполнение callback-функций — настраиваемые пользователем действия, выполняемые в отношении определенных событий, связанных с физикой.

Фазы: (а) — обнаружение столкновения, (б) — реакция на столкновение

Обнаружение столкновений#

Проверка всех пар объектов на столкновение занимает слишком много времени, особенно если сцена большая. Прежде чем выполнять более точные и дорогостоящие вычисления, мы можем отфильтровать пары объектов, которые расположены слишком далеко для столкновения. Таким образом, все объекты, имеющие физические тела, находятся в пределах физического расстояния с использованием дерева сцены.

Примечание
Неколлизионные тела Dummy пропускаются и не моделируются, если они не взаимодействуют с другими телами через сочленения (joints).

На самом деле нет широкой и узкой фаз как таковых, поэтому на следующем шаге все столкновения (формы с формой и формы с поверхностью) вместе с точками контакта ищутся для всех сталкивающихся тел, т. е. если у них есть пересечения или расстояние между ними меньше допустимого значения проникновения. Точки контакта представлены их координатами, нормалями, глубиной проникновения форм, относительной скоростью (между двумя телами), относительным трением и восстановлением. Итак, здесь мы собираем все данные, которые потребуются для разрешения конфликтов позже.

При моделировании физики с ограничениями одни объекты влияют на движение других, а другие — нет. Таким образом, эти объекты могут быть сгруппированы в острова, которые представляют собой автономные группы тел, которые могут влиять на движение друг друга в группе посредством сил / импульсов, но не влияют на объекты, принадлежащие другим островам. Таким образом, все контактирующие тела, а также те, которые имеют сочленения, соединяющие их, объединяются в остров.

Объекты сгруппированы в острова

Если включен режим моделирования физики Stable, тела (body), формы (shape) и сочленения (joints) сортируются внутри островов, чтобы гарантировать, что контакты решаются в предопределенном порядке, а визуализация физики в мире повторяется (на один компьютер).

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

Реакция на столкновение#

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

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

На этом этапе все найденные контакты кэшируются вместе с контактами из предыдущего кадра — для обеспечения правильного взаимодействия. На основе собранных данных о точках контакта UNIGINE вычисляет импульс, который форма получает от столкновения. Контактные точки решаются в псевдослучайном порядке для достижения стабильности и воспроизводимости моделирования.

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

Примечание
В рамках одной итерации физики сочленения можно решать несколько раз. Большое количество совместных итераций увеличивает точность вычислений, а также увеличивает вычислительную нагрузку.

Результаты решения контактов и сочленений накапливаются и применяются к телам. Координаты тел изменяются в соответствии с их новыми линейными и угловыми скоростями.

В процессе расчета реакции на столкновение учитываются два параметра материала, которые могут быть установлены для формы, а также для поверхности:

  • Restitution (восстановление) — степень относительной кинетической энергии, остающейся после столкновения. Это зависит от упругости материалов сталкивающихся тел.

    • Минимальное значение 0 указывает на неупругие столкновения (удары кусочка мягкой глины об пол).
    • Максимальное значение 1 соответствует высоко упругому столкновению (резиновый мяч, отскакивающий от стены).
  • Friction (трение) — сила, препятствующая относительному движению двух соприкасающихся поверхностей. Чем выше значение, тем меньше тенденция к скольжению тела.
Примечание
В случае, если объект содержит поверхность и форму, как с заданным восстановлением, так и с трением, должны использоваться только параметры формы.

Выполнение обратных вызовов#

После этапа моделирования вызываются все обратные вызовы физики. Эти обратные вызовы в основном используются для создания, уничтожения или изменения других объектов, такие операции могут выполняться только в основном потоке.

Примечание
Обратные вызовы физики вызываются в основном потоке.

Дискретное и непрерывное обнаружение столкновений#

Что касается способа учета шкалы времени, используются два основных подхода к поиску точек контакта в случае столкновения. Оба этих подхода реализованы в UNIGINE.

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

Дискретное (a) и непрерывное (b) обнаружение столкновений

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

Маска коллизий#

Чтобы сделать обнаружение столкновений гибким и выборочным, а также снизить затраты на вычисления, используется механизм битового маскирования. Например, у нас есть объект, который не участвует во взаимодействии с другими, но мы хотим, чтобы он лежал на земле. Соответствие битовых масок коллизий этого объекта и земли (хотя бы один бит в масках должен совпадать) дает необходимый эффект. Один объект может участвовать в нескольких проверках столкновения, поскольку для сопоставления пары объектов требуется только один бит маски.

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

Статические и динамические контакты#

Обычно существует два типа контактов:

  • Статический, когда тело опирается на другое тело. В этом случае тела считаются «застывшими» до тех пор, пока на них не воздействует внешняя сила. Это позволяет избежать ненужных вычислений.
  • Динамический, когда два тела, хотя бы одно из которых движется, сталкиваются. В этом случае мы должны рассчитать мгновенное изменение скоростей для обоих сталкивающихся объектов.

Статические (слева) и динамические (справа) контакты

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

См. следующий пример, иллюстрирующий несколько аспектов обнаружения столкновений:

Последнее обновление: 07.03.2023
Build: ()