Обнаружение столкновений
Движение тела без ограничений и препятствий в реальной жизни случается редко, то же самое и в виртуальном мире. Чтобы правильно описать ситуацию, когда тело встречает препятствие, используется обнаружение столкновения.
Алгоритмы обнаружения столкновений, независимо от их реализации, обычно работают с невидимыми упрощенными формами, которые аппроксимируют меши сталкивающихся объектов. Такие аппроксимации называются коллайдерами (или коллизионными формами). Есть несколько типов коллайдеров, которые можно комбинировать: кубы, сферы, цилиндры, капсулы, выпуклые многогранники.
В UNIGINE реализовано два типа коллизий в зависимости от типов сталкивающихся объектов:
- Столкновение формы с формой: между двумя объектами с назначенными физическими свойствами (например, имеющими тело и хотя бы одну форму, оба должны быть включены). В этом случае обнаруживаются точки контакта между формами.
- Столкновение формы с поверхностью: между объектом с назначенными физическими свойствами и нефизическим объектом (т. е. без физического представления). Если для поверхности включен флаг Collision, она также может пассивно участвовать в физическом взаимодействии и предотвращать прохождение физического объекта. В этом случае вычисляются точки контакта между формой и многоугольниками поверхности.
Для того, чтобы объект участвовал в обнаружении столкновений (т.е. был коллайдером), он должен быть добавлен в конкретное BSP-дерево, представляющее физическую сцену. Обнаружение столкновений автоматически включается для объекта, если ему назначено тело или хотя бы одна из его поверхностей имеет включенный флаг Collision. Алгоритм включения / отключения обнаружения столкновений проиллюстрирован ниже.
- При глобальном отключении моделирования физики обнаружение столкновений не отключается.
- В случае, если объекту назначены и включены тело и форма, алгоритмы обнаружения столкновений будут использовать только параметры формы, а параметры его поверхностей будут проигнорированы.
Дополнительная информация#
Описание процесса#
Весь процесс разделен на следующие этапы и фазы:
- Обнаружение столкновений — на этом этапе мы обнаруживаем все столкновения со всеми точками контакта и собираем всю необходимую информацию.
Реакция на столкновение — это результат столкновения (например, два шара отскакивают друг от друга). Без реакции не было бы разницы между столкновением и пересечением двух объектов. Трение, восстановление и другие параметры учитываются при расчете реакции на столкновение.
Выполнение callback-функций — настраиваемые пользователем действия, выполняемые в отношении определенных событий, связанных с физикой.
Обнаружение столкновений#
Проверка всех пар объектов на столкновение занимает слишком много времени, особенно если сцена большая. Прежде чем выполнять более точные и дорогостоящие вычисления, мы можем отфильтровать пары объектов, которые расположены слишком далеко для столкновения. Таким образом, все объекты, имеющие физические тела, находятся в пределах физического расстояния с использованием дерева сцены.
На самом деле нет широкой и узкой фаз как таковых, поэтому на следующем шаге все столкновения (формы с формой и формы с поверхностью) вместе с точками контакта ищутся для всех сталкивающихся тел, т. е. если у них есть пересечения или расстояние между ними меньше допустимого значения проникновения. Точки контакта представлены их координатами, нормалями, глубиной проникновения форм, относительной скоростью (между двумя телами), относительным трением и восстановлением. Итак, здесь мы собираем все данные, которые потребуются для разрешения конфликтов позже.
При моделировании физики с ограничениями одни объекты влияют на движение других, а другие — нет. Таким образом, эти объекты могут быть сгруппированы в острова, которые представляют собой автономные группы тел, которые могут влиять на движение друг друга в группе посредством сил / импульсов, но не влияют на объекты, принадлежащие другим островам. Таким образом, все контактирующие тела, а также те, которые имеют сочленения, соединяющие их, объединяются в остров.
Если включен режим моделирования физики Stable, тела (body), формы (shape) и сочленения (joints) сортируются внутри островов, чтобы гарантировать, что контакты решаются в предопределенном порядке, а визуализация физики в мире повторяется (на один компьютер).
При обнаружении столкновений используются определенные подходы к оптимизации для уменьшения вычислительной нагрузки и повышения эффективности (например, разделение пространства, острова, замораживание и т. д.).
Реакция на столкновение#
Итак, у нас есть вся необходимая информация о столкновениях, теперь нужно что-то сделать с этой информацией, чтобы обеспечить реалистичную реакцию. Реакция на столкновение означает моделирование изменений в движении двух твердых тел после столкновения. При столкновении кинетические свойства двух тел мгновенно меняются. Обычно тела отскакивают друг от друга, скользят или останавливаются в статическом контакте, в зависимости от их упругости и конфигурации столкновения. UNIGINE использует модель импульсной реакции. Во время столкновения первое тело применяет импульс столкновения ко второму в точке контакта, равной по величине, но противоположной по направлению импульсу, приложенному вторым телом, в соответствии с ньютоновским принципом действия и противодействия.
На этом этапе все найденные контакты кэшируются вместе с контактами из предыдущего кадра — для обеспечения правильного взаимодействия. На основе собранных данных о точках контакта UNIGINE вычисляет импульс, который форма получает от столкновения. Контактные точки решаются в псевдослучайном порядке для достижения стабильности и воспроизводимости моделирования.
Сочленения решаются в процессе расчета реакции контакта. Вычисляются импульсы, которые сочленения дают прикрепленным к ним телам: как в соответствии с текущим состоянием сочленения тела должны реагировать, чтобы сочленение оставалось неповрежденным (т.е. на основе их массы, линейной и угловой скорости изменять направление движения и ориентацию), и как этот ответ влияет на сочленение (сочленение может быть разрушено слишком сильным импульсом). Сочленения также решаются в псевдослучайном порядке.
Результаты решения контактов и сочленений накапливаются и применяются к телам. Координаты тел изменяются в соответствии с их новыми линейными и угловыми скоростями.
В процессе расчета реакции на столкновение учитываются два параметра материала, которые могут быть установлены для формы, а также для поверхности:
-
Restitution (восстановление) — степень относительной кинетической энергии, остающейся после столкновения. Это зависит от упругости материалов сталкивающихся тел.
- Минимальное значение 0 указывает на неупругие столкновения (удары кусочка мягкой глины об пол).
- Максимальное значение 1 соответствует высоко упругому столкновению (резиновый мяч, отскакивающий от стены).
- Friction (трение) — сила, препятствующая относительному движению двух соприкасающихся поверхностей. Чем выше значение, тем меньше тенденция к скольжению тела.
Выполнение обратных вызовов#
После этапа моделирования вызываются все обратные вызовы физики. Эти обратные вызовы в основном используются для создания, уничтожения или изменения других объектов, такие операции могут выполняться только в основном потоке.
Дискретное и непрерывное обнаружение столкновений#
Что касается способа учета шкалы времени, используются два основных подхода к поиску точек контакта в случае столкновения. Оба этих подхода реализованы в UNIGINE.
- Дискретное обнаружение столкновений выполняется через определенные промежутки времени, и каждый кадр обрабатывается отдельно от других. В целом дискретизация улучшает производительность. Однако, когда частота кадров проекта уже низкая, небольшой быстро движущийся объект, скорее всего, телепортируется из одной точки в другую вместо того, чтобы плавно перемещаться туда, и столкновение не будет обнаружено.
- Непрерывное обнаружение столкновений не сталкивается с этой проблемой, поскольку движущееся тело выдавливается по своей траектории (между двумя соседними кадрами). В случаях, когда что-то попадает в этот объем и обнаруживается столкновение, тело отправляется назад во времени, чтобы скорректировать реакцию на столкновение.
Основным преимуществом дискретного обнаружения является то, что оно намного быстрее и проще для объектов сложной формы или большого размера. Непрерывное обнаружение столкновений требует математического описания всех объектов и их движений, а также решения систем уравнений, что может быть трудным, медленным или даже невозможным во многих обстоятельствах.
Маска коллизий#
Чтобы сделать обнаружение столкновений гибким и выборочным, а также снизить затраты на вычисления, используется механизм битового маскирования. Например, у нас есть объект, который не участвует во взаимодействии с другими, но мы хотим, чтобы он лежал на земле. Соответствие битовых масок коллизий этого объекта и земли (хотя бы один бит в масках должен совпадать) дает необходимый эффект. Один объект может участвовать в нескольких проверках столкновения, поскольку для сопоставления пары объектов требуется только один бит маски.
Все объекты сцены, если их настройки не менялись, создаются с маской коллизий по умолчанию, т. е. все сталкивается со всем. Это может снизить производительность в случае, если количество объектов в мире велико. Лучше всего определить, что с чем должно сталкиваться.
Статические и динамические контакты#
Обычно существует два типа контактов:
- Статический, когда тело опирается на другое тело. В этом случае тела считаются «застывшими» до тех пор, пока на них не воздействует внешняя сила. Это позволяет избежать ненужных вычислений.
- Динамический, когда два тела, хотя бы одно из которых движется, сталкиваются. В этом случае мы должны рассчитать мгновенное изменение скоростей для обоих сталкивающихся объектов.
Примеры столкновений#
См. следующий пример, иллюстрирующий несколько аспектов обнаружения столкновений: