世界变换与观察变换
将坐标从局部坐标系转换到世界坐标系的过程称为世界变换(world transform),相应的变换矩阵称为世界矩阵(world matrix)。当所有的物体都从局部空间变换到世界空间后,这些物体就会位于同一个坐标系(世界空间)中。世界矩阵描述的是一个物体的局部空间相对于世界空间的原点位置和坐标轴方向。从世界空间到观察空间的坐标转换称为观察变换(view transform),相应的矩阵称为观察矩阵(view matrix)。为了生成场景2D图像,我们必须在场景中放置一架虚拟摄像机。虚拟摄像机指定了观察者可以看到的场景范围。
创建观察矩阵:
D3DXMATRIX* D3DXMatrixLookAtLH(
_Inout_ D3DXMATRIX *pOut, //the result of the operation
_In_ const D3DXVECTOR3 *pEye, //Input camera position
_In_ const D3DXVECTOR3 *pAt, //Input target point
_In_ const D3DXVECTOR3 *pUp //Input world up vector
);
This function uses the following formula to compute the returned matrix:
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
通常,世界坐标系的y 轴就是“向上”方向,所以“向上”向量 通常设为(0, 1, 0)。举一个例子,假设摄像机相对于世界空间的位置为(5, 3,−10),目标点为世界原点(0, 0, 0)。
我们可以使用如下代码创建观察矩阵:
D3DXVECTOR3 position(5.0f, 3.0f, -10.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &worldUp);