计算LookAt矩阵

Dae*_*min 37 math 3d graphics projection

我正在编写一个3d引擎,我遇到了DirectX文档中描述的LookAt算法:

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  l
Run Code Online (Sandbox Code Playgroud)

现在我得到它在旋转方面的工作方式,但我不太明白的是为什么它将矩阵的平移组件放在那些点积上.稍微检查一下,它似乎是根据新基础矢量投影到眼睛/摄像机位置上的一小部分来调整摄像机位置.

问题是为什么需要这样做?它完成了什么?

bob*_*obo 52

请注意,给出的示例是左手行主矩阵.

所以操作是:先转换到原点(按眼睛移动),然后旋转,使得从眼睛At的矢量与+ z对齐:

基本上,如果你通过平移 - 眼睛预先乘以旋转矩阵,你会得到相同的结果:

[      1       0       0   0 ]   [ xaxis.x  yaxis.x  zaxis.x 0 ]
[      0       1       0   0 ] * [ xaxis.y  yaxis.y  zaxis.y 0 ]
[      0       0       1   0 ]   [ xaxis.z  yaxis.z  zaxis.z 0 ]
[ -eye.x  -eye.y  -eye.z   1 ]   [       0        0        0 1 ]

  [         xaxis.x          yaxis.x          zaxis.x  0 ]
= [         xaxis.y          yaxis.y          zaxis.y  0 ]
  [         xaxis.z          yaxis.z          zaxis.z  0 ]
  [ dot(xaxis,-eye)  dot(yaxis,-eye)  dot(zaxis,-eye)  1 ]

补充说明:

请注意,观察变换是(有意)反转的:您将每个顶点乘以此矩阵以"移动世界",以便您想要查看的部分最终出现在规范视图体积中.

还要注意,LookAt矩阵的旋转矩阵(称为R)分量是基矩阵的反转变化,其中R的行是旧基矢量的新基矢量(因此变量名称为xaxis.x ,. .xaxis是基础发生变化后的 x轴).然而,由于反转,行和列被转置.

  • 矩阵乘法不是可交换的. (4认同)
  • 这是最好的答案,比当前接受的答案更有说服力。 (2认同)

Jud*_*den 18

我通过创建一个3x3旋转矩阵构建一个观察矩阵,就像你在这里做的那样,然后将它扩展为带有零的4x4和右下角的单个1.然后我使用负眼点坐标(无点积)构建一个4x4平移矩阵,并将两个矩阵相乘.我的猜测是,这个乘法产生的效果相当于示例底行中的点积,但我需要在纸上进行计算才能确定.

3D旋转可以转换轴.因此,您不能直接使用眼点,也不能将其转换为新的坐标系.这就是矩阵乘法 - 或者在这种情况下,3点积值 - 完成的.

  • 您是否应该通过计算相机方向的反向世界矩阵来创建视图矩阵? (2认同)
  • 如果我错了,请纠正我,但你的描述似乎是*viewing*变换(即*view*矩阵),而OP似乎显示*look-at*矩阵.有一次,我认为*view*和*look-at*matrices在同一个地方,但得到了(昂贵的)刻录,现在我认为它们是2个不同的矩阵.这是错的吗?**look-at*矩阵**与*视图矩阵完全相同**但是只是以不同的方式构建? (2认同)

Bob*_*oss 5

该翻译组件可以帮助您创建一个正交基础,其中您的“眼睛”位于原点,并且其他所有内容都以该原点(您的“眼睛”)和三个轴表示。

这个概念与其说是矩阵正在调整相机位置。相反,它试图简化数学:当您想要渲染从“眼睛”位置可以看到的所有事物的图片时,最简单的方法是假装您的眼睛是宇宙的中心。

所以,简短的回答是,这使得数学变得更容易。

回答评论中的问题:您不只是从所有内容中减去“眼睛”位置的原因与操作的顺序有关。可以这样想:一旦处于新的参考系(即,由 x 轴、y 轴和 z 轴表示的头部位置)中,您现在想要根据这个新的(旋转的)参考系来表达距离。这就是为什么您使用新轴与眼睛位置的点积:这表示物体需要移动的距离相同,但它使用新的坐标系。