为什么我的旋转矩阵不起作用?

时间:2017-08-28 20:46:24

标签: java vector rotation

我的游戏中有各种实体,这些实体都有由矢量阵列

定义的命中框

我的一个实体慢慢旋转以跟随玩家的动作,所以我自然需要点击框旋转。

当我将每个顶点绘制到屏幕时,我的代码会导致扭曲和扭曲的线条。我的entites大小为64 x 64,因此+ 32表示对象的中心。

    public  void rotateVertices(Vector2[] vertices, double angle) {

    double cos = Math.cos(angle);
    double sin = Math.sin(angle);

    for(int i = 0; i < vertices.length; i++){
        Vector2 v = vertices[i];
        vertices[i].x = ((v.x - (x + 32)) * cos - (v.y - (y + 32)) * sin) + (x + 32);
        vertices[i].y = ((v.x - (x + 32)) * sin + (v.y - (y + 32)) * cos) + (y + 32);
    }

}

我的构造函数:

    public EnemyTriBall(Handler handler, float x, float y) {
    super(handler, x, y, 3, 6);

    vertices[0] = new Vector2(x + 25, y + 13);
    vertices[1] = new Vector2(x + 64, y + 33);
    vertices[2] = new Vector2(x + 25, y + 53);

}

1 个答案:

答案 0 :(得分:1)

下面:

Vector2 v = vertices[i];

您不能复制旧矢量,只需参考vectices[i]即可。所以当你这样做时:

vertices[i].x = ((v.x - (x + 32)) * cos - (v.y - (y + 32)) * sin) + (x + 32);

修改原始矢量的x。然后在下一行:

vertices[i].y = ((v.x - (x + 32)) * sin + (v.y - (y + 32)) * cos) + (y + 32);

您使用旧v.y但使用新v.x,这会给您带来奇怪的结果。最简单的解决方法是获取xy并改为使用它们:

    float vx = vertices[i].x;
    float vy = vertices[i].y;
    vertices[i].x = ((vx - (x + 32)) * cos - (vy - (y + 32)) * sin) + (x + 32);
    vertices[i].y = ((vx - (x + 32)) * sin + (vy - (y + 32)) * cos) + (y + 32);

可能还有其他问题,我没有检查公式,但我从这个开始。