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