Обнаружение столкновений, альтернативы отталкиванию

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

Мой текущий подход состоит в том, чтобы немного переместить его, а затем вытолкнуть обратно из геометрии. Кажется, это работает, но я думаю, что это в основном из-за удачи. Я боюсь, что должны быть некоторые крайние случаи, когда этот метод пойдет наперекосяк. Например, острый угол, где две стены толкают персонажа друг в друга.

Как «современный» игровой движок решит эту проблему?


person LaZe    schedule 06.04.2010    source источник
comment
Каким бы замечательным ни было сообщество SO, вы также можете найти некоторые ответы на gamedev.net.   -  person Neil Aitken    schedule 06.04.2010


Ответы (2)


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

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

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

person Ernelli    schedule 06.04.2010
comment
Привет Эрнелли, спасибо за предложение. Кажется хорошей идеей остановить время в точное время столкновения. Я боюсь, что математика слишком сложна для общего решения, где объекты могут вращаться. Однако для этого конкретного случая (эллипсоид против статической геометрии) я думаю, что справлюсь с математикой. - person LaZe; 06.04.2010

Рассмотрите возможность использования сторонних физических библиотек, таких как Chipmunk-physics или Box2D. Когда дело доходит до игровой физики, все, что выходит за рамки самых базовых вещей, может быть довольно сложным, и нет необходимости изобретать велосипед.

Обычно проблема, которую вы упоминаете, решается путем определения количества перекрытий, точек контакта и нормалей к поверхности (например, с помощью теоремы о разделяющих осях). Затем рассчитываются и применяются импульсы, которые изменяют скорости объектов, так что на следующей итерации объекты раздвигаются физически реалистичным образом.

person atis    schedule 06.04.2010
comment
Привет, у меня уже есть физика, работающая с обнаружением столкновений с разделяющими осями для выпуклых сеток и импульсной реакцией на столкновение с трением. Я очень хочу сделать всю эту ерунду сам. Это хобби-проект, поэтому мой приоритет — учиться и кодить что-нибудь интересное. :-) - person LaZe; 06.04.2010
comment
Круто, О, и ты делаешь это в 3d. Между прочим, нередко можно увидеть артефакты в других физических движках, когда два столкновения решаются одновременно и перемещают объект почти в противоположных направлениях, что может заставить объект немного подпрыгивать. Демпфирование и трение уменьшают эти эффекты, но они действительно существуют, и я думаю, что с ними трудно справиться. - person atis; 07.04.2010