Math LookAt函数背后的数学
关于MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/bb281710%28v=vs.85%29.aspx)对于LookAt函数,以下是数学:Math LookAt函数背后的数学,math,matrix,directx,Math,Matrix,Directx,关于MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/bb281710%28v=vs.85%29.aspx)对于LookAt函数,以下是数学: zaxis = normal(cameraTarget - cameraPosition) xaxis = normal(cross(cameraUpVector, zaxis)) yaxis = cross(zaxis, xaxis) xaxis.x yaxi
zaxis = normal(cameraTarget - cameraPosition)
xaxis = normal(cross(cameraUpVector, 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, cameraPosition) -dot(yaxis, cameraPosition) -dot(zaxis, cameraPosition) 1
据我所知,最后一行是翻译。你能解释一下为什么不能将cameraPosition放在这一行上,并且需要点函数吗?这是因为视图矩阵将对象从世界空间转换到相机空间。将相机放置在其位置的不是变换。这就是反变换。 考虑一个简单的2D坐标系: 黑色坐标系是世界坐标系。蓝色的是带系统的照相机。绿色箭头是摄影机在世界空间中的平移向量 视图矩阵会将摄影机从其当前位置放回原点。第一步是旋转,以便两个系统的相应轴指向同一方向: 这是通过矩阵的其他条目(m_11到m_33)实现的 现在只剩下一个翻译了。但是平移向量被转换了。幸运的是,我们知道怎么做。平移向量等于相机位置(注意,DirectX使用了转置矩阵。为了显示后面的数学,我将它们转置回): 如果你看一下结果:
camPos.X * xAxis.x + xamPos.Y * xAxis.y + camPos.z * xAxis.z
然后你会发现这等于
dot ( camPos, xAxis)
最后,使用点积来补偿旋转。如果没有它,相机将在某种程度上发生位移(在本例中过于右上角)。这是因为视图矩阵将对象从世界空间变换到相机空间。将相机放置在其位置的不是变换。这就是反变换。 考虑一个简单的2D坐标系: 黑色坐标系是世界坐标系。蓝色的是带系统的照相机。绿色箭头是摄影机在世界空间中的平移向量 视图矩阵会将摄影机从其当前位置放回原点。第一步是旋转,以便两个系统的相应轴指向同一方向: 这是通过矩阵的其他条目(m_11到m_33)实现的 现在只剩下一个翻译了。但是平移向量被转换了。幸运的是,我们知道怎么做。平移向量等于相机位置(注意,DirectX使用了转置矩阵。为了显示后面的数学,我将它们转置回): 如果你看一下结果:
camPos.X * xAxis.x + xamPos.Y * xAxis.y + camPos.z * xAxis.z
然后你会发现这等于
dot ( camPos, xAxis)
最后,使用点积来补偿旋转。如果没有它,相机会有些位移(在本例中,过于右上角)