C++ 在GLM-openGL中理解摄像机翻译
用于openGL的GLM数学库为构建提供了此实现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]
模板
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的点积可以被认为是a到n的投影。因此,这里发生的一切是,眼睛
向量被投影到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;
}