扫描AABB碰撞的伪代码

时间:2010-08-02 03:06:16

标签: algorithm 2d collision bounding-box

我认为扫描意味着确定物体是否会在某个时刻发生碰撞,而不仅仅是它们当前是否发生碰撞,但如果我错了,请告诉我。

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

我已经尝试并试图找出一种算法来确定两个移动的AABB对象是否会在某个时刻发生碰撞,但我真的很难过。我在这里读了一个关于确定两个物体在某个时刻通过的时间间隔的问题,我没有看到它的问题,但实现它是另一个故事。似乎有太多的异常,似乎我没有正确地做到这一点。

物体只能以直线移动(虽然显然它们可以改变方向,例如转向,但它们总是在轴上。如果它们试图关闭轴,那么它就不起作用),并绑定到轴。他们有界的盒子不会旋转或做任何类似的事情。速度可以改变,但无关紧要,因为该方法的目的是确定,在给定对象的当前状态的情况下,它们是否处于“碰撞过程”。如果您需要更多信息,请告诉我们。

如果有人可以提供一些非常好的伪代码(或真实代码)。我读了一个名为Intersection of Convex Objects: The Method of Separating Axes的文件,但我不理解其中的一些伪代码(联盟意味着什么)?

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分: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;