我正在使用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);
这个问题实际上是用另一种方法解决的。移动相机时,我需要这样做:
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;
}
使相机在正确的轴上移动。
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游戏中一样,就像在战场上一样。相机的移动和键盘输入结合起来效果很好,但现在我的相机可以四处飞行了。我只想能够呆在“地面”上,向前、向后、向左和向右移动,同时像在类似于游戏的战场上那样上下观看,而不必四处飞行(就像没有剪辑那样)。现在,如果我向下或向上看,向前按键盘,我可以“飞”,但我不希