C++ 在GLM-openGL中理解摄像机翻译

C++ 在GLM-openGL中理解摄像机翻译,c++,opengl,glm-math,C++,Opengl,Glm Math,用于openGL的GLM数学库为构建提供了此实现 模板 GLM_FUNC_限定符mat lookAtLH(向量常量和眼睛、向量常量和中心、向量常量和向上) { 向量常数f(归一化(中心眼)); 向量常数s(归一化(交叉(向上,f)); 向量常数u(交叉(f,s)); mat结果(1); 结果[0][0]=s.x; 结果[1][0]=s.y; 结果[2][0]=s.z; 结果[0][1]=u.x; 结果[1][1]=u.y; 结果[2][1]=u.z; 结果[0][2]=f.x; 结果[1][2]

用于openGL的GLM数学库为构建提供了此实现

模板
GLM_FUNC_限定符mat lookAtLH(向量常量和眼睛、向量常量和中心、向量常量和向上)
{
向量常数f(归一化(中心眼));
向量常数s(归一化(交叉(向上,f));
向量常数u(交叉(f,s));
mat结果(1);
结果[0][0]=s.x;
结果[1][0]=s.y;
结果[2][0]=s.z;
结果[0][1]=u.x;
结果[1][1]=u.y;
结果[2][1]=u.z;
结果[0][2]=f.x;
结果[1][2]=f.y;
结果[2][2]=f.z;
结果[3][0]=-点(s,眼);/#此
结果[3][1]=-点(u,眼睛);/#这
结果[3][2]=-点(f,眼);/#这
返回结果;
}
除了我用
/#this
标记的最后三行中完成的翻译因素外,一切都很好。必须对摄影机的世界位置
x、y和z
进行平移,但它是对摄影机的局部坐标和方向向量的点积进行平移的,这不可能是相等的

考虑一种情况,
矢量2*眼睛(眼睛是相机的位置)被传递为
矢量中心(中心是目标位置),那么相机的局部z轴将与方向向量重合,方向向量给出相机的平移因子为
[0,0,1]
,所以我们基本上只沿着z轴移动(因为我们不移动相机,我们只沿着z轴在负方向移动世界),这是我们不想要的。我在哪里遗漏了这一点,或者为什么要进行翻译?

定义了视图矩阵。视图矩阵将顶点坐标从世界空间转换到视图空间。
eye
center
up
分别是世界空间中的位置向量,它们定义了相机在世界空间中的位置和方向<代码>眼睛
居中
向上
定义视图空间。如果您要通过该向量设置矩阵,则矩阵将从视图空间转换到世界空间。
由于视图矩阵必须执行相反的操作(世界空间->视图空间),因此视图矩阵是由
眼睛
中心
向上
定义的矩阵的基础
glm::lookAt
是在这种空间情况下计算逆矩阵的优化算法。
s
u
f
在分配给矩阵时被转置

逆矩阵的平移是而不是矩阵的负平移。逆矩阵的平移必须考虑方向(旋转)。因此,必须旋转平移向量。(3d)矢量旋转3x3可通过(与)3个轴矢量和方向矢量计算。(
s
u
f
)定义一个3x3旋转矩阵,
eye
由该矩阵进行变换

代码实际上是通过转置(
s
u
f
)和
-eye
(非常简化的伪代码)将旋转连接起来:

viewmatrix=转置(旋转(s,u,f))*平移(-eye)

一个向量a与另一个规范化向量n的点积可以被认为是an的投影。因此,这里发生的一切是,
眼睛
向量被投影到
f
s
u
,它们是旋转坐标系的基本向量。通过这些投影,我们可以在f-s-u坐标系中学习
眼睛的x、y和z坐标。

它被投影在
fsu
坐标系上,并用作
逆世界平移的一个因素。
?注释不用于扩展讨论;这段对话已经结束。
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;
    }