This page has been translated automatically.
Видеоуроки
Interface
Essentials
Advanced
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Landscape Tool
Sandworm
Использование инструментов редактора для конкретных задач
Extending Editor Functionality
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World Nodes
Звуковые объекты
Объекты поиска пути
Players
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
Унифицированный язык шейдеров UUSL
Плагины
File Formats
Rebuilding the Engine Tools
GUI
Двойная точность координат
API
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
Работа с контентом
Оптимизация контента
Материалы
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

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

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

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

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

  • Столкновение Shape - Shape : между двумя объектами с назначенными физическими свойствами (например, имеющими body и хотя бы одну shape , оба должны быть включены ). В этом случае обнаруживаются точки контакта между формами.
  • Столкновение Shape - Surface : между объектом с назначенными физическими свойствами и нефизическим объектом (т. е. без физического представления). Если поверхность имеет флаг Collision set, она также может пассивно участвовать в физическом взаимодействии и предотвращать прохождение физического объекта. В этом случае вычисляются точки контакта между формой и многоугольниками поверхности.
Примечание
Масштабирование сеток, участвующих в обнаружении столкновений, не поддерживается.

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

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

Смотрите также#

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ на столкновение#

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

Ответ на столкновение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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