找出2D AABB AABB对撞机的哪一侧?

时间:2011-10-27 21:03:57

标签: java android 2d collision-detection

我正在制作一个突破/破砖/ arkanoid克隆(opengl-es / android)并且我已经在我的碰撞检测代码上停留了很长一段时间。正如标题所暗示的那样:我怎么弄清楚砖的哪一方被球撞了?

因为我只需要在某个方向上反转速度,x或y,当砖块被击中时我可以想到:

 if(speedY < 0) : left, upper or right
 else : left, bottom or right
 if(speedX < 0) : bottom, right or upper
 else : bottom, left or upper  
然而,这并没有让我在决定它是垂直还是水平碰撞方面做得很远,而且那个方向我应该接下来发球。

我已经在互联网上查看了一些代码示例,但这些代码通常对我来说非常模糊,复杂或偏离主题。

2 个答案:

答案 0 :(得分:2)

好吧,如果您知道砖块的位置和球的位置,您可以对每个物体进行测试,以确定砖块的侧面。

假设左上角是标准的Java源:

   +----+
( )|    |
   +----+

如果球的Max-X是&lt;砖的Min-X,你知道它必须在左侧,反之亦然在左侧。您还可以测试顶部和底部碰撞的Y值。

当然,这假设您已经首先进行了碰撞检测。


修改


这是我的碰撞引擎的摘录,这只是一个例子,但这是我如何测试对象是否与它碰撞的东西的左边。

else if ((oCenter.getX() < sCenter.getX()) 
        && ((oCenter.getY() < (sCenter.getY() + sourceHalfHeight)) 
        && (oCenter.getY() > (sCenter.getY() - sourceHalfHeight))))
    return LEFT;

在我的示例中,oCenterPoint2D,它是球的中心。 sCenterPoint2D,它是矩形的中心。 sourceHalfHeight是矩形的一半高度(具有中心点sCenter的对象)。

伪码算法:

if (the center X of the ball < the center X of the rectangle
        AND the center Y of the ball is BETWEEN the max Y and min Y of the rectangle)
    then the ball is to the LEFT of the rectangle
end if

答案 1 :(得分:0)

问题是,你只能以速度知道它,因为球可以在两个不同的时间击中两个不同的侧面,两个时间在相同的方向上以相同的速度。

例: 第一条线击中顶部,第二条线击中侧面,但两者都具有相同的速度和方向

      /
     /   /
 _____  /
|_____| 

你必须使用球的位置并将其与砖的每一侧进行比较