Как движки избегают «Фазовой блокировки» (несколько объектов в одном месте) в Физическом движке?

8

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

Они вечно сталкиваются с векторами с нулевым разрешением скорости, или они просто остаются заблокированными, пока внешняя сила не взаимодействует?

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

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

C0M37
источник
3
Я не могу говорить с реальной реализацией (отсюда комментарий вместо ответа), но по моему опыту физические движки обычно медленно выталкивают два объекта друг из друга. Например, если две коробки порождают перекрывающие друг друга, они будут медленно отталкиваться друг от друга, пока полностью не отделятся. Как именно это будет реализовано, подлежит рассмотрению.
Kevintodisco
Да, я понимаю, что это несколько странный вопрос, поскольку он спрашивает не столько о том, как его реализовать, сколько о том, как это обычно обрабатывается. Спасибо за ваш вклад!
C0M37

Ответы:

4

Я думаю, что этот вид в конечном итоге не отвечает ...

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

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

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

У других наверняка будут более умные вещи, чтобы сказать, но это было слишком долго для комментария.

PSpeed
источник
Я ценю ваш ответ. Мне хотелось задать этот вопрос как своего рода спасательный плот, который другие могут найти, если они когда-нибудь попадут в ту же ситуацию.
C0M37
Lol @PSpeed ​​здесь также ^^
SHiRKiT
0

Это обрабатывается двумя способами:

  1. Исправьте перекрытие между встречными объектами
  2. генерировать «нормальную» силу, которая раздвинет объекты, если они столкнутся.

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

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

Ян Янг
источник