碰撞检测-在Java中,在旋转的正方形的拐角处保留一个正方形



我正在制作一个zamboni驾驶游戏,并进行碰撞检测。我试着通过检查zamboni的一角是否在墙内来完成它。我使用LWJGL在拐角位置绘制了一个矩形。目前,我的角位于zamboni的中心,但我希望它位于它的左上角。我可以这样做,但当我旋转zamboni时,角的东西不会到达zamboni实际角的位置,而是停留在与zamboni未旋转时相同的位置。

这是我的代码:

cornerLocation.x = position.x + (float) Math.cos(Math.toRadians(angle + 90));
cornerLocation.y = position.y + (float) Math.sin(Math.toRadians(angle + 90));

position是一个向量,我在这里存储zamboni的位置。它的原点在中心,所以zamboni的左上角基本上位于大小为/2的位置。

我怎么能让它总是在zamboni的实际角落,即使我旋转它?

您需要两组坐标:

  • 赞博尼角球得分
  • 用于碰撞检测的矩形点

矩形点可以从zamboni角计算。为此:你必须得到它们中的"min-x"one_answers"min-y":

Point topLeftRect = new Point(Math.min(zamboniCorner1.x,zamboniCorner2.x,zamboniCorner3.x,zamboniCorner4.x),
                              Math.min(zamboniCorner1.y,zamboniCorner2.y,zamboniCorner3.y,zamboniCorner4.y));
Point bottomRightRect = new Point(Math.max(zamboniCorner1.x,zamboniCorner2.x,zamboniCorner3.x,zamboniCorner4.x),
                                  Math.max(zamboniCorner1.y,zamboniCorner2.y,zamboniCorner3.y,zamboniCorner4.y));
Rectangle collisionDetectionRectangle =new Rectangle(topLeftRect,bottomRightRect);

检测冲突矩形大小通常大于Zamboni大小。

旋转会发生什么?

步骤(多种可能方式之一(

2d点{x,y}->转到3d:{x,y,1}

float[][] zamboniCorner1Point3d = {{zamboniCorner1.x,zamboniCorner1.y,1}};
...
float[][] zamboniCorner4Point3d = {{zamboniCorner4.x,zamboniCorner4.y,1}};

1.-你需要将zamboni的中心移动到(0,0(,然后你用中心将Zamboi的角放下:

你可以使用这个三维矩阵(1(:

float[][] translationMatrix1 = {{1, 0,-zamboniCenter.x},{0, 1,-zamboniCenter.y},{0, 0, 1}};
float[][] zamboniCorner1Point3dNew = Matrix.cross(zamboniCorner1Point3d,translationMatrix1);
...
float[][] zamboniCorner4Point3dNew = Matrix.cross(zamboniCorner4Point3d,translationMatrix1);
Point' -> Point * Matrix1

2.-你需要旋转所有的堇青石(zamboni的中心不变,它是{{0,0,1}(

You can used this 3-d matrix (2):
float[][] rotationMatrix2 = {Math.cos(rotationAngle), Math.sin(rotationAngle), 0 }, {-Math.sin(rotationAngle), Math.cos(rotationAngle), 0}, {0, 0, 1 }};

float[][] zamboniCorner1Point3dNew = Matrix.cross(zamboniCorner1Point3dNew,rotationMatrix2);
...
float[][] zamboniCorner4Point3dNew = Matrix.cross(zamboniCorner4Point3dNew,rotationMatrix2);
Point' -> Point * Matrix2

3.-你需要将zamboni的中心(从{0,0,1}(移动到原始位置(在第一个{{zamboniCenter.x,zamboniCenter.y,1}}的同一位置(,并放下带有中心的角。

You can used a 3-d matrix(3): 

float[][] translationMatrix3 = {{1, 0, zamboniCenter.x},{0, 1, zamboniCenter.y},{0, 0, 1}};
float[][] zamboniCorner1Point3dNew = Matrix.cross(zamboniCorner1Point3dNew,translationMatrix3);
...
float[][] zamboniCorner4Point3dNew = Matrix.cross(zamboniCorner1Point3dNew,translationMatrix3);
Point' -> Point * Matrix3

4.-设置新值。

zamboniCorner1.x = zamboniCorner1Point3dNew[0];
zamboniCorner1.y = zamboniCorner1Point3dNew[1];
...
zamboniCorner4.x = zamboniCorner4Point3dNew[0];
zamboniCorner4.y = zamboniCorner4Point3dNew[1];

5.-然后,获得:新zamboni角的min-x、min-y、max-x和max-y,这是你的新碰撞检测矩形。左上角:(min-x,min-y(右下角:(max-x,max-y(。

Point topLeftRect = new Point(Math.min(zamboniCorner1.x,zamboniCorner2.x,zamboniCorner3.x,zamboniCorner4.x),
                              Math.min(zamboniCorner1.y,zamboniCorner2.y,zamboniCorner3.y,zamboniCorner4.y));
Point bottomRightRect = new Point(Math.max(zamboniCorner1.x,zamboniCorner2.x,zamboniCorner3.x,zamboniCorner4.x),
                                  Math.max(zamboniCorner1.y,zamboniCorner2.y,zamboniCorner3.y,zamboniCorner4.y));
Rectangle collisionDetectionRectangle =new Rectangle(topLeftRect,bottomRightRect);

步骤1、2和3;可以一起计算:

float[][] matrix = Matrix.cross(Matrix.cross(translationMatrix1,rotationMatrix2),translationMatrix3);
float[][] zamboniCorner1Point3dNew = Matrix.cross(zamboniCorner1Point3d,matrix);
...
float[][] zamboniCorner4Point3dNew = Matrix.cross(zamboniCorner4Point3d,matrix);

Point' -> Point * (Matrix-1 * Matrix-2 * Matrix-3)

最新更新