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轴).然而,由于反转,行和列被转置.
Jud*_*den 18
我通过创建一个3x3旋转矩阵构建一个观察矩阵,就像你在这里做的那样,然后将它扩展为带有零的4x4和右下角的单个1.然后我使用负眼点坐标(无点积)构建一个4x4平移矩阵,并将两个矩阵相乘.我的猜测是,这个乘法产生的效果相当于示例底行中的点积,但我需要在纸上进行计算才能确定.
3D旋转可以转换轴.因此,您不能直接使用眼点,也不能将其转换为新的坐标系.这就是矩阵乘法 - 或者在这种情况下,3点积值 - 完成的.
该翻译组件可以帮助您创建一个正交基础,其中您的“眼睛”位于原点,并且其他所有内容都以该原点(您的“眼睛”)和三个轴表示。
这个概念与其说是矩阵正在调整相机位置。相反,它试图简化数学:当您想要渲染从“眼睛”位置可以看到的所有事物的图片时,最简单的方法是假装您的眼睛是宇宙的中心。
所以,简短的回答是,这使得数学变得更容易。
回答评论中的问题:您不只是从所有内容中减去“眼睛”位置的原因与操作的顺序有关。可以这样想:一旦处于新的参考系(即,由 x 轴、y 轴和 z 轴表示的头部位置)中,您现在想要根据这个新的(旋转的)参考系来表达距离。这就是为什么您使用新轴与眼睛位置的点积:这表示物体需要移动的距离相同,但它使用新的坐标系。