理解 GLM-openGL 中的相机翻译

Posted

技术标签:

【中文标题】理解 GLM-openGL 中的相机翻译【英文标题】:understanding camera translation in GLM- openGL 【发布时间】:2020-02-24 08:34:20 【问题描述】:

openGL 的 GLM 数学库为构造 lookAt matrix 提供了此实现。

template<typename T, qualifier Q>
    GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtLH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)
    
        vec<3, T, Q> const f(normalize(center - eye));
        vec<3, T, Q> const s(normalize(cross(up, f)));
        vec<3, T, Q> const u(cross(f, s));

        mat<4, 4, T, Q> Result(1);
        Result[0][0] = s.x;
        Result[1][0] = s.y;
        Result[2][0] = s.z;
        Result[0][1] = u.x;
        Result[1][1] = u.y;
        Result[2][1] = u.z;
        Result[0][2] = f.x;
        Result[1][2] = f.y;
        Result[2][2] = f.z;
        Result[3][0] = -dot(s, eye);  //#this
        Result[3][1] = -dot(u, eye);  //#this
        Result[3][2] = -dot(f, eye);  //#this
        return Result;
    

一切都很好,除了我用//#this 标记的最后三行中完成的翻译因素。必须为相机的世界位置x, y and z 完成平移,但它是为相机的局部坐标和方向矢量的点积完成的,这不可能相等。

考虑一种情况,其中vector 2*eye(眼睛是相机的位置)作为vector center(中心是目标位置)传递,那么相机的局部z轴将与方向矢量重合,从而为我们提供平移因子对于相机为[0,0,1],所以我们基本上只会沿着z-axis沿着世界移动(因为我们不移动相机,我们只会沿着z轴在负方向移动世界)是我们不想要的。我在哪里漏掉了重点,或者为什么要翻译?

【问题讨论】:

【参考方案1】:

glm::lookAt 定义视图矩阵。视图矩阵将顶点坐标从世界空间转换到视图空间。eyecenterup 分别是世界空间中的位置向量,它们定义了相机在世界空间中的位置和方向。 eyecenterup 定义视图空间。如果您通过此向量设置矩阵,则矩阵将从视图空间转换为世界空间。 由于视图矩阵必须做相反的事情(世界空间 -> 视图空间),所以视图矩阵是由 eyecenterup 定义的矩阵的 inverse matrix。 glm::lookAt 是一种优化算法,用于在这种空间情况下计算逆矩阵。 注意suf 在分配给矩阵时会被转置。

逆矩阵的平移不是矩阵的负平移。逆矩阵的平移必须考虑方向(旋转)。因此,必须旋转平移向量。 (3d) 矢量旋转 3x3 Rotation matrix 可以通过(与)轴矢量和方向矢量的 3 Dot products 计算。 (s, u, f) 定义一个 3x3 旋转矩阵,eye 被这个矩阵变换。

代码实际上是通过转置(suf)和-eye(非常简化的伪代码)进行转换来连接旋转:

viewmatrix = transpose(rotation(s, u, f)) * translation(-eye)

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。【参考方案2】:

一个向量 a 与另一个归一化向量 n 的点积可以被认为是 an。所以,这里所发生的只是eye 向量被投影到fsu,它们是旋转坐标系的基向量。通过这些投影,我们可以在f-s-u中学习eyexyz坐标坐标系。

【讨论】:

它被投影在fsu 坐标系上并用作inverse world translation 的一个因子?

以上是关于理解 GLM-openGL 中的相机翻译的主要内容,如果未能解决你的问题,请参考以下文章

高级openg 混合,一个完整程序

OpenGL试图翻译物体,但相机也翻译,我不需要

OpenGL,第一人称相机翻译

Sceneview 翻译/移动带有手势的视角相机

如何理解相机设置中的 对比度饱和度及亮度

优化流媒体vbo openg