我正在尝试将其打造为 FPS 风格的相机,您可以使用鼠标环顾四周。我已经可以正常工作了,但是当我四处移动然后水平查看时,它会从原点旋转所有内容。我做错了什么?
private float moveSpeed = 0.1f;
private Vector3f camera;
private float horizontalAngle = 0.0f;
private float verticleAngle = 0.0f;
public Game() {
Mouse.setGrabbed(true);
camera = new Vector3f(0.0f, 0.0f, 0.0f);
}
public void input(){
horizontalAngle += Mouse.getDX() * 0.05f;
verticleAngle += -Mouse.getDY() * 0.05f;
if(Keyboard.isKeyDown(Keyboard.KEY_W)){
camera.x -= moveSpeed * Math.sin(Math.toRadians(horizontalAngle));
camera.z += moveSpeed * Math.cos(Math.toRadians(horizontalAngle));
}
if(Keyboard.isKeyDown(Keyboard.KEY_S)){
camera.x += moveSpeed * Math.sin(Math.toRadians(horizontalAngle));
camera.z -= moveSpeed * Math.cos(Math.toRadians(horizontalAngle));
}
if(Keyboard.isKeyDown(Keyboard.KEY_A)){
camera.x -= moveSpeed * Math.sin(Math.toRadians(horizontalAngle - 90));
camera.z += moveSpeed * Math.cos(Math.toRadians(horizontalAngle - 90));
}
if(Keyboard.isKeyDown(Keyboard.KEY_D)){
camera.x -= moveSpeed * Math.sin(Math.toRadians(horizontalAngle + 90));
camera.z += moveSpeed * Math.cos(Math.toRadians(horizontalAngle + 90));
}
if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
Mouse.setGrabbed(false);
}
}
public void update(){
}
public void render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// draw quad
glTranslatef(camera.x, camera.y, camera.z);
glRotatef(verticleAngle, 1.0f, 0.0f, 0.0f);
glRotatef(horizontalAngle, 0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glColor3f(1.0f, 0.5f, 0.5f);
glVertex3f(0.0f, 0.0f, -5.0f);
glVertex3f(1.0f, 0.0f, -5.0f);
glVertex3f(1.0f, 1.0f, -5.0f);
glVertex3f(0.0f, 1.0f, -5.0f);
glEnd();
glRotatef(-horizontalAngle, 0.0f, 1.0f, 0.0f);
glRotatef(-verticleAngle, 1.0f, 0.0f, 0.0f);
glTranslatef(-camera.x, -camera.y, -camera.z);
Display.sync(60);
Display.update();
}
我正在将 LWJGL 与 Java 结合使用。
最佳答案
您需要两个 vector 来进行相机旋转:一个用于相机的位置 (u),另一个用于相机的方向 (v)(v 的长度并不重要)。然后使用gluLookAt(u.x, u.y, u.z, u.x+v.x, u.y+v.y, u.z+v.z, 0.0, 1.0, 0.0)
,表示相机位于 u 位置,看 u+v 点,向上方向的 vector 为 (0,1,0)。
关于java - 使用 OpenGL 进行 FPS 相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19031379/