Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math LookAt函数背后的数学_Math_Matrix_Directx - Fatal编程技术网

Math 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

关于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           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)
最后,使用点积来补偿旋转。如果没有它,相机会有些位移(在本例中,过于右上角)