2010-08-02 98 views
3

我认为扫描意味着确定对象是否会在某个时刻发生碰撞,而不仅仅是他们当前是否发生碰撞,但如果我错了告诉我。扫描AABB碰撞的伪代码

我有一个对象,有界框在轴上对齐。对象的框可以是不同的大小,但它们总是矩形的。

我试过并试图找出算法来确定两个移动的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 2010-08-02 23:21:25