OpenGL 相机目标问题

OpenGL camera target issue

我正在用 C++ 实现一个 3D 迷宫游戏,使用 OpenGL,其中相机位于迷宫中间正上方的固定位置,也看着中间。它的工作方式和外观与我想要的一样,但我的代码不太好,因为我需要将 + 0.01f 放入该位置才能正常工作。如果我错过了,迷宫不出现,好像相机指向相反的方向..如何优雅地修复它?

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))

UpDirection 是 (0.0f, 1.0f, 0.0f) lookAt 函数如下所示:

Matrix = glm::lookAt(CameraPosition, FrontDirection, UpDirection);

我知道按照惯例,在 OpenGL 中,相机指向负 z 轴,因此 FrontDirection 基本上指向其目标的相反方向。对我来说,像我上面那样设置位置是完全清楚的,但它仍然没有像我预期的那样工作。 (除非我把那个+ 0.01f

提前感谢您的回答!

I know that by convention, in OpenGL the camera points towards the negative z-axis

在视空间中,z 轴指向视口外,但这完全无关紧要。您定义视图矩阵、相机的位置和方向。相机位置是 glm::lookAt 的第一个参数。相机朝向 target 的方向,glm::lookAt.

的第二个参数

glm::lookAt的第2个参数不是方向向量,是视线上的一个点。 通过CameraPosition+FrontDirection计算视线上的一个点:

Matrix = glm::lookAt(CameraPosition, CameraPosition+FrontDirection, UpDirection);

您的向上矢量与视线方向相同。向上应该orthogonal到视线。向上向量定义 roll:

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);