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

java collision detection between two rotated rectangles

我想知道两个 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 度的内容会导致问题。我该如何解决这个问题来测试两个旋转矩形之间的碰撞?任何帮助表示赞赏。

I will tell the logic instead of code here follow these works.

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

1.Create 一个以你正在旋转的轴为中心的圆,矩形的长度为半径(设半径为 r1)

2.Do 第二个矩形相同(半径为 r2)

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

4.calculate r1+r2

5.if r1+r2 >= distance 然后两个矩形相交于一点

6.Else他们没有相交

我在此处提供 link link 根据条件 1 if(r1+r2)=distance 和 2 if(r1+r2)>distance[ 存在 1 或 2 个点=12=]

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

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

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

很遗憾,您的情况是上述 none。这些矩形具有不同的坐标系,并且由于其中一个矩形的旋转边缘可能与第二个矩形的轴垂直或平行,因此不能那样对待它们。

其中一种方法是像您在此处所做的那样使用边界框:

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

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

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

PS。使用边界框并没有错,它是检查两个图形是否没有碰撞的简单方法(如果边界框不碰撞图形不能碰撞),您仍然可以将它用作更快的预检查以消除明显的情况。