2

我最近完成的 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);

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

4

2 回答 2

2

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

幸运的是,当您从欧拉角(xrot、yrot)计算相机 viewMatrix 时,旋转矩阵正好包含要添加的值:

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

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

如果高度保持不变,则忽略 ry,uy,fy 分量,但准备对剩余的两个分量进行归一化。

于 2012-12-29T06:24:26.153 回答
0

也许看看基于旧 gluLookAt 的相机,那么您将更好地控制相机位置和它指向的位置。

这里有一些链接:

于 2012-12-29T10:02:04.297 回答