Как разрешить проникновение двух сталкивающихся тел

9

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

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

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

Адам
источник

Ответы:

3

Когда вы обнаружите столкновение, определите, в какое время / точку тела впервые начали сталкиваться, и обработайте столкновение в этой точке. Возможно, на этом этапе у вас все еще есть небольшое проникновение, но оно будет намного меньше и [как правило] не приведет к возникновению проблем с колебаниями.

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

notlesh
источник
1
Таким образом, вы в основном предлагаете реализовать непрерывное обнаружение столкновений, а затем обрабатывать проникновения, оставшиеся такими же, как я уже, так как они, вероятно, будут очень маленькими. Это может сработать, я полагаю. Теперь мне осталось только выяснить, как сделать непрерывное обнаружение столкновений :)
Адам
Не уверен, что вы подразумеваете под непрерывным. Строго говоря, в физическом моделировании нет ничего непрерывного, так как все всегда разбивается на дискретные шаги определенного размера. Меньшие шаги, что я и предлагаю, приведут к гораздо меньшим ошибкам (и их будет легче исправить). Еще один способ думать об этом заключается в том, что существует прямая связь между размером шага и ошибками (такими как проникновение). Поэтому, когда вы обнаружите такую ​​ошибку, разбейте ее на более мелкие этапы, пока ошибка не станет тривиально исправимой.
notlesh
Непрерывное обнаружение столкновений означает, что вместо проверки пересечения между двумя статическими объектами (проблема 3d) вы проверяете контакт двух движущихся объектов (в основном, проблема 4d). Обычно достаточно учитывать только постоянные скорости, потому что вы можете аппроксимировать траектории кусочно-линейными кривыми. Преимущество заключается в том, что расстояние проникновения всегда будет равно нулю (или близко к нему из-за ошибок округления с плавающей точкой). Я думал, что вы говорили об этом, но, возможно, я неправильно истолковал ваш ответ?
Адам
@adam Да, именно об этом я и говорю.
notlesh
2

Ознакомьтесь с этой статьей, которая была опубликована здесь много раз раньше, просто выполните поиск в разделе «Вопросы и ответы» по обнаружению столкновений, и в нем показано, как выполнить «непрерывное» разрешение столкновений, о котором говорил Стивелтон:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

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

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