Скольжение AABB столкновение - застревание на краях - PullRequest
6 голосов
/ 11 октября 2010

Я работаю над трехмерной плиткой и использую обнаружение коллизий AABB.Для каждого куба, который игрок пересекает, я нахожу ось, вдоль которой игрок пересекает куб, и выталкиваю игрока из куба вдоль этой оси.

В зависимости от порядка, в котором кубы находятсяотметьте, это может вызвать проблемы при скольжении по краю нескольких кубов.Я создал диаграмму, которая должна объяснить проблему:

http://imgur.com/mmK0W.png

  • Стрелка # 1 - попытка движения игрока.Другие стрелки - это реакция на столкновение.
  • На левой диаграмме столкновение сначала проверяется на правый куб, в результате чего игрока толкают влево, а затем вверх.( bad )
  • На правой диаграмме сначала проверяется столкновение с левым кубом, в результате чего игрок толкается вверх, после чего игрок больше не пересекает другой куб.( хорошо )

Есть какие-нибудь идеи о том, как наиболее эффективный способ решить эту проблему?Или есть ли лучший способ справиться с реакцией на столкновение?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 11 октября 2010

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

Для каждого куба c1 , c2 ... ci , с которым пользовательский куб ( uc ) пересекается во время проверки, вы хотите выяснить, к какому кубу было «прикоснуто» первым - есть только одинкак в реальной жизни.Рассмотрим направление d из uc , и, взяв сумму uc в ci (перекрытие), найдите положение cu в то время, когда он «коснулся» ci .

Определите, к какому кубу «прикоснулись» первыми cj (тот, который требовал наибольшего отката по оси d- чем раньше, тем лучше) и используйте только этот для расчета реакции на столкновение.

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

0 голосов
/ 25 мая 2016

Столкновение может толкнуть объект только по 1 оси.Чтобы определить ось для толчка:

else   -- not this
elseif -- change to this

if w > h then
    push x
elseif h > w then
    push y
end

Это работает, если ваши плитки выровнены.

Используйте круги, чтобы избежать прилипания к выровненным плиткам

0 голосов
/ 11 октября 2010

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

0 голосов
/ 11 октября 2010

Из вашей диаграммы кажется, что вы хотите наименьшее движение, которое минимизирует перекрытие между игроком и кубами. Каждый кубик с перекрытием будет пытаться «толкнуть» игрока в двух ортогональных направлениях. Можете ли вы сделать что-то вроде выбора минимального толчка из максимальных толчков в каждом направлении?

...