OpenGL相机目标问题

问题描述 投票:0回答:1

我正在用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)

先谢谢您的解答!

c++ opengl camera direction
1个回答
1
投票

我知道按照惯例,在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);
© www.soinside.com 2019 - 2024. All rights reserved.