我正在用C++实现一个3D迷宫游戏,使用OpenGL,摄像头在一个固定的位置,正好在迷宫的中间上方,也在看中间。它的工作原理和外观就像我想要的一样,但是我的代码不是很好,因为我需要把一个 + 0.01f
到的位置才能很好的工作。如果我漏掉了,labirynth就不显示了,好像镜头指向了相反的方向。如何才能优雅地解决这个问题?
glm::vec3 FrontDirection = glm::vec3(((GLfloat)MazeSize / 2) + 0.01f, 0.0f, ((GLfloat)MazeSize / 2)
(0,0,0)origo的位置是迷宫的左角(起始位置),所以这是我设置这样的位置的原因。
glm::vec3 CameraPosition = glm::vec3(((GLfloat)MazeSize / 2), ((GLfloat)MazeSize + 5.0f), ((GLfloat)MazeSize / 2))
上升方向是... (0.0f, 1.0f, 0.0f)
lookAt函数是这样的。
Matrix = glm::lookAt(CameraPosition, FrontDirection, UpDirection);
我知道按照惯例,在OpenGL中 摄像机是指向负Z轴的 所以FrontDirection基本上是指向目标的反方向。对我来说,像我上面那样设置位置是完全清楚的,但它仍然不能像我所期望的那样工作。(除非我把那个 + 0.01f
)
先谢谢您的解答!
我知道按照惯例,在OpenGL中,摄像机指向负Z轴。
在视图空间中,Z轴指向视口外,但这完全不相关。你可以定义视图矩阵、摄像机的位置和方向。摄像机的位置是 glm::lookAt
. 摄像机看向的方向是 目标的第2个论点 glm::lookAt
.
第2个参数是 glm::lookAt
不是方向矢量,而是视线上的一点。通过以下方法计算视线上的一点。CameraPosition+FrontDirection
:
Matrix = glm::lookAt(CameraPosition, CameraPosition+FrontDirection, UpDirection);
你的向上矢量与视线方向一致。上升的方向应该是 正交 的视线。上向量定义了 滚动:
glm::vec3 CameraPosition = glm::vec3(
((GLfloat)MazeSize / 2), ((GLfloat)MazeSize + 5.0f), ((GLfloat)MazeSize / 2));
glm::vec3 CameraTarget = glm::vec3(
((GLfloat)MazeSize / 2), 0.0f, ((GLfloat)MazeSize / 2));
glm::vec3 UpDirection = glm::vec3(0.0f, 0.0f, 1.0f);
Matrix = glm::lookAt(CameraPosition, CameraTarget, UpDirection);