Позвольте мне сначала объяснить блокировку фазы: когда два объекта с ненулевой массой занимают одно и то же пространство, но имеют нулевую энергию (без скорости).
Они вечно сталкиваются с векторами с нулевым разрешением скорости, или они просто остаются заблокированными, пока внешняя сила не взаимодействует?
В своем домашнем двигателе я понял, что если я загружу персонажа в дерево и перенесу его, он будет сигнализировать о столкновении и прыгать обратно в исходное место. Я полагаю, что мог бы исправить это, реализовав импульсы в случае столкновения, вместо того, чтобы просто вернуться к последнему месту, в котором я находился (моя реализация отстой).
Но хотя я делаю свой двигатель более надежным, мне просто интересно, как большинство других физических движков справляются с этим делом. Разве объекты, которые начинаются в одном и том же месте без скорости движения, просто вылетают друг от друга в случайном направлении? Или они сидят там, пока что-то не происходит? Какой вариант, как правило, самый лучший?
источник
Ответы:
Я думаю, что этот вид в конечном итоге не отвечает ...
Я думаю, что иногда это зависит от реализации и базового подхода, используемого для обнаружения и разрешения столкновений (я полагаю, что это 80% физического движка твердого тела). Забавно, потому что на днях я просто решил эту проблему в своем собственном физическом движке и бросил объект в пространство NaN.
У меня был объект, появляющийся точно в том же месте, что и другой объект, и оба были одинаковой формы. В этом конкретном случае генератор контактов сделал очень плохие значения. Я исправил это, выбрав произвольные значения для контакта (толкать меньший / более легкий объект вверх, в основном). Это был довольно скучный случай.
Если стул будет порождаться внутри стола, то это будет зависеть от того, какие контакты были созданы, развалились ли они или застряли. В моем случае я не использую систему, основанную на ограничениях (по крайней мере, пока), поэтому объект с такой же вероятностью разлетится на части, как и колебаться и засыпает. В системе проникновения + импульса, подобной той, которую я использую, довольно легко увидеть все уродливое и как это закончится. Я понятия не имею, как система, основанная на ограничениях, решает эту проблему или даже обнаруживает ее ... ограничение кажется мне недоступным без какого-либо вмешательства, и я понятия не имею, существует ли стандартный способ для этих типов двигателей.
У других наверняка будут более умные вещи, чтобы сказать, но это было слишком долго для комментария.
источник
Это обрабатывается двумя способами:
Это работает, однако, только если вы различаете скорость / время. Это не будет работать в игре на основе тайлов и приведет к видимым артефактам, таким как один объект, либо туннелирующий сквозь объект, либо заметно выталкиваемый из другого объекта.
В случае игр на основе тайлов вы можете использовать прогнозирующий подход, проверяя, где будет находиться объект, если он движется. Если движение вызовет блокировку фазы, запретите движение.
источник