我正在编写一个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
现在我得到它在旋转方面的工作方式,但我不太明白的是为什么它将矩阵的平移组件放在那些点积上.稍微检查一下,它似乎是根据新基础矢量投影到眼睛/摄像机位置上的一小部分来调整摄像机位置.
问题是为什么需要这样做?它完成了什么?
请注意,给出的示例是左手行主矩阵.
所以操作是:先转换到原点(按眼睛移动),然后旋转,使得从眼睛到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轴).然而,由于反转,行和列被转置.
我通过创建一个3x3旋转矩阵构建一个观察矩阵,就像你在这里做的那样,然后将它扩展为带有零的4x4和右下角的单个1.然后我使用负眼点坐标(无点积)构建一个4x4平移矩阵,并将两个矩阵相乘.我的猜测是,这个乘法产生的效果相当于示例底行中的点积,但我需要在纸上进行计算才能确定.
3D旋转可以转换轴.因此,您不能直接使用眼点,也不能将其转换为新的坐标系.这就是矩阵乘法 - 或者在这种情况下,3点积值 - 完成的.