Обнаружение столкновения, альтернативы «выталкивать» - PullRequest
4 голосов
/ 06 апреля 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 апреля 2010

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

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

1 голос
/ 06 апреля 2010

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

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

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

...