Java中的二维矢量旋转

Java中的二维矢量旋转,java,vector,game-physics,Java,Vector,Game Physics,我试着做一个简单的比赛游戏。 因此,我得到了一辆车,它的位置向量和方向向量 我有一个更新和一个输入法: public void update(double delta) { float rotation = 0; if(movement.normalized().getY() < 0) { rotation = (float) (2*Math.PI - Math.acos(movement.normalized().getX())); } else

我试着做一个简单的比赛游戏。 因此,我得到了一辆车,它的位置向量和方向向量

我有一个更新和一个输入法:

public void update(double delta) {
    float rotation = 0;
    if(movement.normalized().getY() < 0) {
        rotation = (float) (2*Math.PI - Math.acos(movement.normalized().getX()));
    } else {
        rotation = (float) Math.acos(movement.normalized().getX());
    }

    pos = pos.add(new Vector3f((float) (Math.cos(rotation) * (movement.length() - 2) * delta), (float) (Math.sin(rotation) * (movement.length() - 2) * delta), 0f));

    v1 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos((rotation + basicAngel)) * radius), (float) (pos.getY() + (Math.sin((rotation + basicAngel)) * radius)), 0), new Vector2f(0, 0));
    v2 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos(((2*Math.PI - basicAngel) + rotation)) * radius), (float) (pos.getY() + Math.sin(((2*Math.PI - basicAngel) + rotation)) * radius), 0), new Vector2f(0, 0));
    v3 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos((Math.PI + rotation + basicAngel)) * radius), (float)(pos.getY() + Math.sin((Math.PI + rotation + basicAngel)) * radius), 0), new Vector2f(0, 0));
    v4 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos(((Math.PI - basicAngel) + rotation)) * radius), (float)(pos.getY() + Math.sin(((Math.PI - basicAngel) + rotation)) * radius), 0), new Vector2f(0, 0));
    v5 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos((windowAngel + rotation)) * windowRadius), (float)(pos.getY() + Math.sin((windowAngel + rotation)) * windowRadius), 0), new Vector2f(0, 0));
    v6 = new Vertex(new Vector3f((float)(pos.getX() + Math.cos(((2*Math.PI - windowAngel) + rotation)) * windowRadius), (float)(pos.getY() + Math.sin(((2*Math.PI - windowAngel) + rotation)) * windowRadius), 0), new Vector2f(0, 0));
}
其中a是运动矢量的角度
l是运动向量的长度

每件事都应该很好地工作,而且确实如此,只是有时会计算错误,导致汽车按预期的方向行驶


有人能帮我找出错误吗?

你不能用acos获得角度。例如,Math.cos(Math.PI*3/4)和Math.cos(Math.PI*5/4)都为-0.7071。看看余弦曲线,看看原因。 要获得向量的角度,请使用Math.atan2(y,x)。 另外,为什么要将向量转换为角度,然后再转换回向量。这是没有必要的。为什么不使用标准化向量表示方向,使用浮点/双精度表示速度,并在每次更新时将其相乘


或者您可以执行movement=movement.add(movement.normalized().mul(0.2))

谢谢你的回答。我没想到晒成棕褐色,但你是对的,那好多了。我将应用你的建议,然后做一个报告。
public void input() {

    float tempX = movement.normalized().getX();
    float tempY = movement.normalized().getY();
    float tempLength = movement.length();

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
        movement = movement.rotate(3);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
        movement = movement.rotate(-3);
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
        if (tempLength <= 7) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength + 0.2)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength + 0.2)));

        }
    } else {
        if(tempLength > 2) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength - 0.05)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength - 0.05)));

        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
        if (tempLength >= 0) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength - 0.2)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength - 0.2)));

        }
    } else {
        if (tempLength < 2) {

            movement.setX((float) (Math.cos(Math.acos(movement.normalized().getX())) * (tempLength + 0.05)));
            movement.setY((float) (Math.sin(Math.acos(movement.normalized().getX())) * (tempLength + 0.05)));

        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
        reset();
    }
}
x = cos a * (l + speed)
y = sin a * (l + speed)