当前位置: 首页 > 知识库问答 >
问题:

OpenGL第一人称相机位置问题

巫马英豪
2023-03-14

我最近完成的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个答案

龙昊焱
2023-03-14

也许在老gluLookAt的基础上观察相机,那么你就能更好地控制相机的位置和指向的位置。

以下是一些链接:

  • http://www.songho.ca/opengl/gl_transform.html
  • http://www.lighthouse3d.com/tutorials/glut-tutorial/keyboard-example-moving-around-the-world/
  • http://www.codeproject.com/Articles/84698/OpenGL-Camera
滑畅
2023-03-14

你可能期望参考相机指向的位置移动。这意味着在适用的情况下在x、y和z位置添加增量。

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

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

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

如果高度保持不变,则忽略ry、uy、fy分量,但准备将剩下的两个分量正常化。

 类似资料:
  • 我正在使用GLM库实现一个第一人称相机,它为我提供了一些有用的函数,可以计算透视和“注视”矩阵。我也在使用OpenGL,但这不会对代码产生影响。 在这张图片中,你可以看到四个摄像头的位置。标有1的是在运动之前,标有2的是在运动之后。红色三角形表示沿z轴笔直向前的相机。蓝色三角形代表一个相机,该相机已沿x轴(向左)旋转向后看。当我按下“向前移动键”时,相机在两种情况下都会沿z轴向前移动,而不考虑相机

  • 我正在使用LWJGL和OpenGL 3.2为OpenGL编写java游戏引擎。每当移动鼠标旋转相机时,它都会添加滚动、俯仰和偏航。 摄像头代码 四元数代码

  • 我正在用LWJGL开发一个3D游戏,我想添加一个支持鼠标的第一人称相机。我现在有一个,但它并不顺利,一点也不好用。我真的希望窗口也能聚焦,这样鼠标就可以启动,而不是在窗口上悬停。我如何实现这一点? 以下是我当前的摄像头实现:

  • 所以我在制作这个FPS游戏,我想通过键盘输入向前、向后、向左和向右移动,并用相机环顾四周,就像在一个真正的FPS游戏中一样,就像在战场上一样。相机的移动和键盘输入结合起来效果很好,但现在我的相机可以四处飞行了。我只想能够呆在“地面”上,向前、向后、向左和向右移动,同时像在类似于游戏的战场上那样上下观看,而不必四处飞行(就像没有剪辑那样)。现在,如果我向下或向上看,向前按键盘,我可以“飞”,但我不希

  • 我正在使用键盘上的箭头键实现一个第一人称相机,在场景中移动。当我只绕一个轴(X或Y)旋转时,它似乎工作正常,但是如果我绕两个轴旋转,它也会绕第三个轴Z旋转。我敢肯定,问题在于我的相机不是绕着全局轴旋转,而是绕着局部轴旋转,当我只需要偏航和俯仰时,就会产生“滚动”。在我的代码中,我从X和Y旋转推导出一个前向向量,存储在两个变量中。最相关的代码片段如下: 功能由功能补充: } 其中,相当于偏航,相当于

  • 症状是,“摄像头位置”似乎围绕x轴镜像(负z而非正z),并且“摄像头方向”与预期方向相反<换句话说,我必须将相机旋转180度,然后将其向前移动才能看到任何渲染 在我看过的所有OpenGl相机教程中,相机位置总是有一个正的z坐标。也许代码中只有一个符号错误,但我看不出来。我还发布了相应的着色器代码 我的对象在世界坐标z=0.1处渲染 摄影机实例的初始化显示在以下几行中 哪里 结果是黑屏。当我将相机位