gpt4 book ai didi

c++ - glm::lookat,OpenGL 中的透视澄清

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:24 24 4
gpt4 key购买 nike

大家好,

我将相机的眼睛设置在正 z 轴 (0, 0, 10) 上,向上指向正 y (0, 1, 0),并以正 x (2, 0, 0) 为中心。如果 y 向上,并且相机向下注视 z 轴负方向,则 x 在屏幕坐标中指向左侧,在右手 OpenGL 世界坐标中。

我还有一个以世界原点为中心的对象。随着相机看起来更向左(正 x 方向),我希望以原点为中心的对象在生成的屏幕投影中向右移动。但我看到情况恰恰相反。

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

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)] vector ,我从 viewMatrix 的逆向中提取它。让我大吃一惊的是,当我使用该相机的 VP 矩阵时,它指向的方向与从 viewMatrix 的逆向提取的相同前向方向相反。我也非常感谢对这种差异的任何见解。

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

结果图像: enter image description here

最佳答案

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定义一个 View 矩阵。 glm::lookAt 的参数在世界空间中,glm::lookAtcenter 参数定义了你注视的位置。

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

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

enter image description here

视线是从眼睛位置到中心位置的 vector :

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) 或翻转向上 vector ,例如(0, -1, 0).

关于c++ - glm::lookat,OpenGL 中的透视澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51297017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com