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

第一人称相机移动问题

谭修然
2023-03-14

我正在使用GLM库实现一个第一人称相机,它为我提供了一些有用的函数,可以计算透视和“注视”矩阵。我也在使用OpenGL,但这不会对代码产生影响。

在这张图片中,你可以看到四个摄像头的位置。标有1的是在运动之前,标有2的是在运动之后。红色三角形表示沿z轴笔直向前的相机。蓝色三角形代表一个相机,该相机已沿x轴(向左)旋转向后看。当我按下“向前移动键”时,相机在两种情况下都会沿z轴向前移动,而不考虑相机方向。

我想要的是一种更像FPS的行为,向前按压会使我朝着相机所面对的方向移动。我认为通过我传递给glm::lookAt的参数,这一点就可以实现。显然不是。

我的计算出了什么问题?

// Calculate the camera's orientation
float angleHori = -mMouseSpeed * Mouse::x; // Note that (0, 0) is the center of the screen
float angleVert = -mMouseSpeed * Mouse::y;

glm::vec3 dir(
    cos(angleVert) * sin(angleHori),
    sin(angleVert),
    cos(angleVert) * cos(angleHori)
);

glm::vec3 right(
    sin(angleHori - M_PI / 2.0f),
    0.0f,
    cos(angleHori - M_PI / 2.0f)
);

glm::vec3 up = glm::cross(right, dir);

// Calculate projection and view matrix
glm::mat4 projMatrix = glm::perspective(mFOV, mViewPortSizeX / (float)mViewPortSizeY, mZNear, mZFar);
glm::mat4 viewMatrix = glm::lookAt(mPosition, mPosition + dir, up);

共有2个答案

颛孙昆
2023-03-14

这个问题实际上是用另一种方法解决的。移动相机时,我需要这样做:

void Camera::moveX(char s)
{
    mPosition += s * mSpeed * mRight;
}

void Camera::moveY(char s)
{
    mPosition += s * mSpeed * mUp;
}

void Camera::moveZ(chars)
{
    mPosition += s * mSpeed * mDirection;
}

使相机在正确的轴上移动。

文鸣
2023-03-14

gluLookAt采用3个参数:眼睛、中心和向上。前两个是位置,而最后一个是向量。如果你打算使用这个函数,最好只维护这三个参数。

说到计算的问题。我发现位置变量在整个代码中都是不变的。所有的变化都是注视点,也就是说,中心。正确的做法是首先执行position=dir,这将沿dir所指的方向移动相机(位置)。现在要更新中心,第二个参数可以保持原样:位置方向;这将起作用,因为该位置已更新为新位置,从那里我们可以进一步了解dir方向。

 类似资料:
  • 我最近完成的opengl程序中有一个“相机”。然而,我注意到每当我旋转然后再次移动时,x、y和z的角度都会改变。例如,当我按下“w”键时,我沿着“z”轴向前移动。如果我然后旋转相机90度,当我按下“W”键时,我实际上会沿着“x”轴向右移动。为什么会发生这种情况是有道理的,我只是想知道为什么会发生。这是旋转函数: 键盘功能: 以及我的翻译功能: 有没有办法解决这个问题?

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

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

  • 我正试图用Java/LWJGL制作一个游戏/演示,但第一人称摄像头有问题: 我使用WASD来移动向量,无论发生什么奇怪的事情: 当我把眼睛移开或移向我时,右边和左边的部分会被挡住。 当我把眼睛移到我的右边或左边时,视图的顶部和底部会被我的视图挡住。 我已经成功实现了鼠标移动(环顾四周),现在相关代码片段: (注意:Matrix4f类以列主顺序工作) 我真的不知道为什么相机的行为如此奇怪,这意味着什

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

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