两个旋转矩形之间的java碰撞检测

时间:2016-02-13 23:35:20

标签: java rotation collision-detection affinetransform

我想判断两个rectangles是否发生碰撞。如果矩形没有旋转我没有问题,但是当它们都旋转时我的逻辑中有一些问题。这是我目前正在使用的方法:

    public static void car_on_ai_collision( AI ai, Entity e ){

        //rotation of each rectangle in radians
        double ai_rot = ai.getAIEntity().getRotation().y;
        double car_rot = e.getRotation().y;

        //stores the center point of the rectangles
        Vector3f ai_loc = ai.getAIEntity().getLocation();
        Vector3f car_loc = e.getLocation();

        //here i am lining the square for my car up to a axis by making it have no rotation
        ai_rot -= car_rot;
        car_rot = 0;

        //creating rectangles with the size of the car
        Rectangle car = new Rectangle(175, 70);
        Rectangle ai_rec = new Rectangle(175, 70);


        car.translate((int) ((int) car_loc.x-87.5), (int) car_loc.z-35); 

        //rotation for rectangle
        AffineTransform aiAT = new AffineTransform();
        aiAT.translate((int) ai_loc.x - 87.5, (int) ai_loc.z-35);
        aiAT.rotate( Math.toDegrees(ai_rot), ai_loc.x, ai_loc.z);

        Area a = new Area(ai_rec);
        a.transform(aiAT);

        //testing for collision
        if(a.getBounds2D().intersects(car)){
            System.out.println("Collision!");
        }
    }

碰撞检测似乎没有接近正确,从我理解的一个轴需要对齐。我试图对齐其中一个轴,然后测试与AffineTransform的碰撞但我在网上看到有关旋转超过90度的事情会导致问题。如何解决此问题以测试两个旋转矩形之间的碰撞?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

只有两种情况下碰撞检测很简单:

    圈子之间
  • 在对齐的矩形之间

SmashCode解释了如何检测圆圈之间的碰撞。 对齐的矩形更容易,你只需要比较矩形的最大和最小坐标重叠。

可悲的是你的情况不属于上述情况。这些矩形具有不同的坐标系,并且由于它们的旋转,其中一个ractangle的边缘可能是垂直的,也不是平行于第二个的轴,并且它们不能被这样处理。

其中一种方法是像你在这里一样使用边界框:

if(a.getBounds2D().intersects(car)){
    System.out.println("Collision!");
}

调用a.getBounds2D()创建与坐标系对齐并覆盖整个形状的矩形。但是边界框也会覆盖一些没有被形状占据的空间。因此,检查对齐的矩形和旋转的矩形边界框之间的碰撞是快速而简单的,但可能会产生误差,如图所示 drawing of rectangles and bounding box of rotated one.

要完全准确地检查碰撞,您需要使用一些更复杂的方法,例如使用多边形投射(投影)到不同轴上的SAT。事实上,您只使用矩形意味着您只需要两个轴,并且您已经知道了它们的方向。

PS。使用边界框是不对的,很容易检查两个数字是否没有碰撞(如果边界框不会碰撞数字不会碰撞),你仍然可以使用它作为更快的前期检查以消除明显的案例。

答案 1 :(得分:1)

jsonConf is undefined error;

让您旋转的枢轴为(x1,y1),第二个矩形枢轴为(x2,y2)

1.创建一个圆圈,旋转的旋转角度为矩形长度(半径为r1)

2.对第二个矩形(半径为r2)

进行相同的操作

3.将d标记为2个圆心之间的距离。使用2点之间的距离公式a = Math.pow((x2-x1),2)b =((y2-y1),2)距离= Math.sqrt(a + b)

4.计算r1 + r2

5.如果r1 + r2> =距离,那么两个矩形在点

处相交

6.Else他们没有相交

我在这里提供链接link它们相交的位置根据条件1存在1或2个点如果(r1 + r2)=距离则为2,如果(r1 + r2)>距离