java - 使用 OpenGL 进行 FPS 相机旋转

标签 java opengl camera lwjgl frame-rate

我正在尝试将其打造为 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/

相关文章:

java - 如何让 Java 作业只确定一次日期

c++ - 纹理平面上的 OpenGL 光照不工作

android - int数组到android中的opengl纹理

java - RX Java 2,接受要添加的新值的 Observable

javascript - 重新加载当前页面而不丢失用户输入

c++ - 管理 OpenGL 状态机的策略

iphone - 如何仅在 iOS 中使用相机计算对象的高度和宽度?

ios - 在 iOS 4.3 中将 YpCbCr iPhone 4 相机帧渲染为 OpenGL ES 2.0 纹理

java - 从命令行停止 jvm 以正常关闭

opengl - WebGL 的酷应用程序?