视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的局部坐标系,从局部点到世界点需要先缩放旋转后平移Mx*My*Mz*P的变换矩阵,而从世界点到局部点要进行先平移后旋转缩放的逆过程P-1Mz-1My-1Mx-1的变换矩矩阵(PMzMyMx是重用局部点到世界的变换).
矩阵是重新分解和组合空间位置和方位的空间变换过程;
矩阵行是新坐标系的基向量或表示平移,用变换后的向量在原坐标系各轴分解得的向量表示;
矩阵列是对应原坐标系的各轴,是各新基向量在列对应原坐标系的轴上的累积(组合)向量。
*/
D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);//camera在世界坐标系中的位置向量
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);//target是camera的朝向向量,可以是原点,也 可以是其它观察点
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);//定义向上的方向,一般是[0,1,0]
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &up);//V是world-to-view空间的变换矩阵,是view-to-world空间变换矩阵的逆矩阵
Device->SetTransform(D3DTS_VIEW, &V);//设置变换的状态,实际变换时,先得到变换矩阵,然后才将相机内的物体乘以变换矩阵。
原型:
D3DXMATRIX* D3DXMatrixLookAtLH(
_Inout_ D3DXMATRIX *pOut,
_In_ const D3DXVECTOR3 *pEye, // 视图坐标系中新的观察点的位置(可以解释为新的摄像机位置from)
_In_ const D3DXVECTOR3 *pAt, // 观察目标原来所在的世界坐标系的位置(变换时需要camera观察点平移旋转到该点),一般是(0,0,0)或者原来世界坐标系位置(观察目标位置)(可以解释为变换后的摄像机平移旋转到的位置to,世界物体根据新的观察坐标系进行参考定位)。
_In_ const D3DXVECTOR3 *pUp // 向上的方向,一般是(0,1,0)
);
返回的新坐标系是:
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) 1
// 注意到平移是各个方向上都求了逆,旋转是旋转物体的逆矩阵也就是实现坐标系变换,用新的坐标系描述所有物体。
参考:http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb205342%28v=vs.85%29.aspx