OpenGL第一人称摄像头位置问题

时间:2012-12-29 02:28:52

标签: java opengl lwjgl

我的opengl程序中有一个“相机”,我最近完成了。但是,我注意到每当我旋转然后再移动时,x,y和z角度就会改变。例如,当我按下“w”键时,我沿着“z”轴向前移动。如果我然后将相机旋转90度,当我按下“W”键时,我实际上将向右移动,看似沿着“x”轴。这是有道理的,为什么会发生这种情况,我只是想知道为什么会发生这种情况。这是旋转功能:

private void camera() {
    glRotatef(xrot, 1.0f, 0.0f, 0.0f);
    glRotatef(yrot, 0.0f, 1.0f, 0.0f);
}

键盘功能:

if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
        xpos -= 0.035 * delta;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
        xpos += 0.035 * delta;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
        zpos += 0.03f * delta;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
        zpos -= 0.035 * delta;
    }
if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
        xrot += 0.035;
        if (xrot > 360) {
            xrot -= 360;
        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
        xrot -= 0.035;
        if (xrot > 360) {
            xrot += 360;
        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
        yrot += 0.035;
        if (xrot > 360) {
            xrot -= 360;
        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
        yrot -= 0.035;
        if (xrot > 360) {
            xrot += 360;
        }

    }

我的翻译功能:

        glTranslated(xpos, ypos, zpos - 30);

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:2)

您可能希望参考相机指向的位置移动。这意味着在适用时将增量添加到x,y和z位置。

幸运的是,当你从欧拉角(xrot,yrot)计算你的摄像机viewMatrix时,旋转矩阵包含了要添加的值:

 [rx ux fx - ]
 [ry uy fy - ] = viewMatrix
 [rz uz fz - ]
 [ - -  -  - ]

忽略标有' - '的元素,你应当在向右/向左移动时添加/减去“右”列vector =(rx,ry,rz),“向上”向量=(ux,uy,uz)当向前/向后移动时向上/向下移动和前向量(fx,fy,fz)。

如果高度保持不变,那么只需忽略ry,uy,fy组件,但要准备将两个剩余组件标准化。

答案 1 :(得分:0)

可能会根据旧的gluLookAt查看相机,然后您可以更好地控制相机位置及其指向的位置。

这里有一些链接: