LookAt 矩阵实现中的点积
Dot product in LookAt Matrix implementation
我正在研究用于在 OpenGL 中创建视图矩阵的 lookAt 矩阵的实现。这个特定的实现来自 glm 数学库。
在计算 lookAt 矩阵时,变换的位置向量被计算为各个方向轴与眼睛位置的点积。例如位置向量的x值为-dotProduct(RightVector, eyeVector)
我知道点积值表示两个向量彼此的相似程度。但是这里为什么要用它来计算位置呢?
此函数描述右手坐标系的 lookAt 矩阵:
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(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(f, up)));
vec<3, T, Q> const u(cross(s, f));
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);
Result[3][1] =-dot(u, eye);
Result[3][2] = dot(f, eye);
return Result;
}
"lookAt" 的参数定义了相机(眼睛)在世界中的位置和方向。由该参数设置的矩阵会将视图 space 转换为世界 space。它可以获取相对于相机的坐标并将它们转换为世界坐标。
但是视图矩阵必须从世界 space 转换为视图 space。视图矩阵必须获取世界坐标并计算相对于相机的相应坐标。
从世界 space 转换到视图 space 的矩阵是定义相机在世界中的位置和方向的矩阵的 inverse matrix。
将此算法视为逆相机矩阵的优化计算。
输入是相机在世界中的位置 space。它必须计算相机相对于相机方向的位置。为此 Dot product is used. The dot product can "project" a vector to an other vector. It calculates the component (length) of vector along an other vector or axis. Note, s
, u
and f
are Unit vectors。在这种情况下,点积用于计算 eye
相对于轴 s
、u
的 x
、y
和 z
分量] 和 -f
。 s
、u
和 -f
是世界的轴线 space,从视图 space 看。
这与通过视图矩阵的左上角 3x3 变换向量完全相同。
我正在研究用于在 OpenGL 中创建视图矩阵的 lookAt 矩阵的实现。这个特定的实现来自 glm 数学库。
在计算 lookAt 矩阵时,变换的位置向量被计算为各个方向轴与眼睛位置的点积。例如位置向量的x值为-dotProduct(RightVector, eyeVector)
我知道点积值表示两个向量彼此的相似程度。但是这里为什么要用它来计算位置呢?
此函数描述右手坐标系的 lookAt 矩阵:
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(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(f, up)));
vec<3, T, Q> const u(cross(s, f));
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);
Result[3][1] =-dot(u, eye);
Result[3][2] = dot(f, eye);
return Result;
}
"lookAt" 的参数定义了相机(眼睛)在世界中的位置和方向。由该参数设置的矩阵会将视图 space 转换为世界 space。它可以获取相对于相机的坐标并将它们转换为世界坐标。
但是视图矩阵必须从世界 space 转换为视图 space。视图矩阵必须获取世界坐标并计算相对于相机的相应坐标。
从世界 space 转换到视图 space 的矩阵是定义相机在世界中的位置和方向的矩阵的 inverse matrix。
将此算法视为逆相机矩阵的优化计算。
输入是相机在世界中的位置 space。它必须计算相机相对于相机方向的位置。为此 Dot product is used. The dot product can "project" a vector to an other vector. It calculates the component (length) of vector along an other vector or axis. Note, s
, u
and f
are Unit vectors。在这种情况下,点积用于计算 eye
相对于轴 s
、u
的 x
、y
和 z
分量] 和 -f
。 s
、u
和 -f
是世界的轴线 space,从视图 space 看。
这与通过视图矩阵的左上角 3x3 变换向量完全相同。