glm::lookat,OpenGL 中的透视澄清

glm::lookat, perspective clarification in OpenGL

大家好,

我将相机的眼睛设置在正 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] 观察和透视变体。

结果图像:

I would expect my origin-centered object to move right in the resulting screen projection. But I see the opposite is the case.

glm::lookAt 定义了一个视图矩阵。 glm::lookAt的参数在世界space中,glm::lookAtcenter参数定义了你看的位置。

视图space 是局部系统,由场景中的视点定义。 视图的位置、视线和视图的向上方向,定义了一个相对于世界坐标系的坐标系。视图矩阵从世界 space 转换为视图(眼睛)space。

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

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

eye    = (0, 0, 10)
center = (2, 0, 0)
up     = (0, 1, 0)

los = center - eye = (2, 0, -10)

在这种情况下,如果物体的中心在(0, 0, 0),你看(0, 0, 2),你看的是物体右边的一个位置,这个表示对象向左移动。
如果你改变观点,这将会改变,例如(0, 0, -10) 或翻转向上向量,例如(0, -1, 0).