【问题标题】:glm::lookat, perspective clarification in OpenGLglm::lookat,OpenGL 中的透视澄清
【发布时间】:2018-12-20 04:13:15
【问题描述】:

大家好,

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

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

我缺乏基本的理解吗?如果是这样,是什么?如果没有,任何人都可以解释如何正确使用 glm 生成视图和投影矩阵,在默认的 OpenGL 右手世界模型中,它们被发送到着色器?

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] 变体的lookat和perspective。

生成的图像:

【问题讨论】:

    标签: c++ opengl perspective glm-math


    【解决方案1】:

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

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

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

    如果视图空间的坐标系是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)。

    【讨论】:

    • 啊!我的物理课程让我印象深刻,拇指指向 Z 方向,而不是 X。难怪对 GL 坐标系有这么多的困惑哈哈
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多