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。点积可以将一个向量“投影”到另一个向量。它计算向量沿其他向量或轴的分量(长度)。请注意,suf 是 Unit vectors。在这种情况下,点积用于计算eye 与轴su-f 相关的xyz 分量。 su-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 实现中的点积的主要内容,如果未能解决你的问题,请参考以下文章

scipy稀疏矩阵和numpy数组之间的点积给出ValueError

二维坐标系中的点积叉积多边形面积

使用原子操作的 CUDA 中的点积 - 得到错误的结果

向量与 SIMD 的点积

仅影响零值的两个稀疏矩阵的点积

计算lookAt矩阵不起作用?