2010-08-02 6 views
3

Я думаю, что swept означает определение того, будут ли объекты сталкиваться в какой-то момент, а не только в настоящее время они сталкиваются, но если я ошибаюсь, скажите мне.Pseudocode для Swept AABB Collision

У меня есть объекты с ограниченными рамками, которые выровнены по оси. Ящики объектов могут быть разных размеров, но они всегда прямоугольные.

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

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

Если кто-то может предоставить какой-нибудь псевдокод (или настоящий код), который был бы замечательным. Я прочитал документ под названием Intersection of Convex Objects: The Method of Separating Axes, но я не понял некоторые из его псевдокодов (что означает Союз)?

Любая помощь будет благодарна, спасибо.

ответ

1

При столкновении коробки будут касаться одной стороны. Вы можете проверить, будут ли они касаться пар сторон (LR, RL, UD, DU).

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

Что-то вроде следующего кода:

dLR = B.L - A.R; 
dRL = A.L - B.R; 
dUD = B.U - A.D; 
dDU = A.U - B.D; 

vX = A.xV - B.xV; 
vY = A.yV - B.yV; 

tLR = dLR/vX; 
tRL =-dRL/vX; 
tUD = dUD/vY; 
tDU =-dDU/vY; 

hY = dUD + dDU; //combined height 
hX = dLR + dRL; 

if((tLR > 0) && (abs(dDU + vY*tLR) < hY)) return true; 
if((tRL > 0) && (abs(dUD - vY*tRL) < hY)) return true; 
if((tUD > 0) && (abs(dRL + vX*tUD) < hX)) return true; 
if((tDU > 0) && (abs(dLR - vX*tDU) < hX)) return true; 
return false; 
+0

Это поставило меня на правильном пути! Благодаря! – random

 Смежные вопросы

  • Нет связанных вопросов^_^