LookAt Matrix 实现中的点积
Posted
技术标签:
【中文标题】LookAt Matrix 实现中的点积【英文标题】:Dot product in LookAt Matrix implementation 【发布时间】:2019-08-15 15:33:26 【问题描述】:我正在通过一个lookAt 矩阵的实现来在OpenGL 中创建视图矩阵。这个特定的实现来自 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;
【问题讨论】:
【参考方案1】:“lookAt”的参数定义了相机(眼睛)在世界中的位置和方向。由该参数设置的矩阵会将表单视图空间转换为世界空间。它可以获取相对于相机的坐标并将它们转换为世界坐标。
但是视图矩阵必须从世界空间转换到视图空间。视图矩阵必须获取世界坐标并计算相对于相机的相应坐标。 从世界空间转换到视图空间的矩阵是该矩阵的inverse matrix,它定义了相机在世界中的位置和方向。
将此算法视为逆相机矩阵的优化计算。
输入是相机在世界空间中的位置。它必须计算相机相对于相机方向的位置。为此,使用了Dot product。点积可以将一个向量“投影”到另一个向量。它计算向量沿其他向量或轴的分量(长度)。请注意,s
、u
和 f
是 Unit vectors。在这种情况下,点积用于计算eye
与轴s
、u
和-f
相关的x
、y
和z
分量。 s
、u
和 -f
是从视图空间看到的世界空间的轴。
这与通过视图矩阵的左上角 3x3 变换向量完全相同。
【讨论】:
我大致了解视图矩阵在 OpenGL 中的工作原理。我感兴趣的是为什么在这个逆lookAt矩阵中使用点积来计算眼睛的位置。 @LennyWhite 你的问题对我来说有点不清楚。您想知道点积的作用吗?无论如何,我已经扩展了答案。 谢谢这有点帮助。但是使用像这样的点积,也相当于将旋转的lookAt矩阵(矩阵的左边3x3)与平移的眼睛矩阵相乘R * T
?
@LennyWhite 如果T
是关于eye
的(4x4) 平移矩阵,而R
是包含视图矩阵左上角3x3 的(4x4) 旋转矩阵,则@987654341 @ 其中V
是视图矩阵。
是的,我知道。无论如何,我认为This is exactly the same as transforming a vector by the upper left 3x3 of the view matrix
或多或少地回答了我的问题。以上是关于LookAt Matrix 实现中的点积的主要内容,如果未能解决你的问题,请参考以下文章