【发布时间】:2014-04-02 21:37:48
【问题描述】:
我正在使用 GLM 库实现第一人称相机,该库为我提供了一些计算透视和“lookAt”矩阵的有用函数。我也在使用 OpenGL,但这对这段代码没有影响。
基本上,我所体验的是我可以环顾四周,就像在常规 FPS 中一样,并且可以四处走动。但是移动被限制在三个轴上,如果我旋转相机,我仍然会沿着相同的方向移动,就像我没有旋转它一样......让我说明一下(在 2D 中,以简化事情)。@ 987654321@
在这张图片中,您可以看到四个摄像头位置。 标有 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);
【问题讨论】: