glm :: lookat,OpenGL中的透视说明

时间:2018-07-12 03:48:29

标签: c++ opengl perspective glm-math

大家,

我将相机的眼睛设置在z轴的正方向(0、0、10)上,向上指向正y(0、1、0),并居中于正x(2、0、0)。如果y向上,并且摄影机向下沿z轴负方向凝视,则屏幕坐标中的x点将位于左手OpenGL世界坐标中。

我还有一个以世界原点为中心的物体。当摄像机向左看时(x方向为正),我希望以原点为中心的对象在最终的屏幕投影中向右移动。但是我看到相反的情况。

我缺乏基本的了解吗?如果是这样,该怎么办?如果没有,谁能解释在默认的OpenGL右手世界模型中如何正确使用glm生成视图和投影矩阵,并将其发送到着色器?

glm::vec3 _eye(0, 0, 10), _center(2, 0, 0), _up(0, 1, 0);
viewMatrix = glm::lookAt(_eye, _center, _up);
projectionMatrix = glm::perspective(glm::radians(45), 6./8., 0.1, 200.);

我发现有趣的另一件事是图像点中的红线沿正x方向。从字面上看,它是场景中另一台摄像机的[eye->(forward + eye)]矢量,我从viewMatrix的逆中提取出该矢量。使我感到困惑的是,当我使用该相机的VP矩阵时,它指向的方向与从viewMatrix的反方向提取的相同的正向相反。我也非常感谢对此差异的任何见解。

同样值得注意的是:我通过cmake构建了glm 0.9.9。并且我验证了它使用了外观和透视图的右侧[-1,1]变体。

结果图像: enter image description here

1 个答案:

答案 0 :(得分:1)

  

我希望以原点为中心的对象在生成的屏幕投影中向右移动。但是我看到的是相反的情况。

glm::lookAt定义视图矩阵。 glm::lookAt的参数在世界空间中,center的{​​{1}}参数定义您的观察位置。

视图空间是本地系统,由场景上的视点定义。 视图的位置,视线和视图的向上方向定义了相对于世界坐标系的坐标系。视图矩阵从世界空间转换为视图(眼睛)空间。

如果视图空间的坐标系统是Right-handed系统,则X轴指向左侧,Y轴指向上方,Z轴指向视图之外(右手注意)系统Z轴是X轴和Y轴的叉积。

enter image description here

视线是从glm::lookAt位置到eye位的向量:

center

在这种情况下,如果对象的中心在(0,0,0)处,而您在(0,0,2)处看,则您将在对象的右侧看到一个位置,这意味着该对象向左移动。
如果您改变视角,例如(0、0,-10)或向上翻转向量,例如(0,-1,0)。