我尝试做一个简单的比赛游戏。 为此,我得到了一辆汽车,它的位置是一个矢量,一个是它面向的方向。Java中的2D矢量旋转
我有一个更新和输入方法:
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));
}
第一if语句检查是否低于0的归一化矢量的y分量是。
确保汽车在水平轴下旋转。
下一行将旋转和速度应用到位置。
带有v1 ... v4的程序块计算汽车的角落进行渲染。
v5和v6是车窗的角落。
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();
}
}
前两个if语句检查是按下了左键还是右键。如果发生这种情况,运动vetor旋转。 接下来的两个语句检查向上和向下键,并通过使用该式appliing速度,以移动矢量:
x = cos a * (l + speed)
y = sin a * (l + speed)
其中a是运动矢量
和升的角度的长度运动矢量
一切都应该正常工作,它的确如此,只是它有时会错误计算,以至于汽车的行驶方向与预期不同。
有人能帮我找到错误吗?
谢谢你的回答。我没有想过晒黑,但你说得对,那样更好。我将在此之后应用您的建议并提交报告。 – henne90gen