为了形成定义场景的2D图像,我们必须将虚拟相机放在场景中。相机指定了观众可以看到的世界体积,因此通过这个世界的体积生成我们需要的2D图像。让我们定义局部坐标系统(称为视图空间,视觉空间,或相机空间),如图5.19。 它方便了在渲染管线的后期阶段相对于相机坐标系来描述它们,而不是相对于世界空间描述我们的场景顶点,从世界空间到视图空间的坐标变换被称为视图变换,以及相应的矩阵称为视图矩阵。

如果QW=(Qx,QY,QZ,1),UW=(UX,UY,UZ,0),VW=(VX,VY,VZ,0),和WW=(WX,WY,WZ,0)分别介绍原点,x轴,y轴,z轴(相对于世界空间的视图空间齐次坐标),那么我们知道,从§3.4.3可知,从视图空间到世界空间的坐标矩阵转换是:

但是,这不是我们想要的转换。我们想从世界空间反向变换视图空间。但从§3.4.5召回的反向变换只是通过逆给出。因此。 W-1(即V)表示从世界空间转换到视图空间

世界坐标系统和视图坐标系统一般仅相差位置和导向,所以它使直观意义上,W = RT(即世界矩阵可以被分解为一个旋转后跟一个平移)。这种形式使更容易计算:

所以视图矩阵定义如下

我们现在表明一种直观的方式来构造构建视图矩阵所需要的向量。设Q是摄像机的位置和设T
是摄像机瞄准的目标点。此外,令j是一个描述世界空间的“Up”方向的单位矢量。 (在
这本书中,我们使用世界XZ平面为我们的世界“地平面”和世界y轴描述了“Up”的方向;因此,J =
(0,1,0)只是平行于世界y轴的单位矢量。然而,这仅仅是一个惯例,而有些应用可能会选择xy平面作为接地平面,和z轴为“Up”方向)。参看图5.20,相机被赋予为:

w矢量描述相机的局部z轴单位向量u由下式给出:

这个矢量描述相机的局部x轴。最后,描述照相机的局部y轴的向量由下式给出:

v = w × u

因为w和u是正交单位矢量,w×u是一定是单位矢量,因此它不需要进行归一化。

因此,给定的相机的位置,目标点,和世界上“Up”方向,我们能够得出可以用于形成视图矩阵的相机的局部坐标系统。

XNA的数学库提供以下功能基于刚才所描述的过程计算视图矩阵


XMMATRIX XMMatrixLookAtLH( // Outputs resulting view matrix V
FXMVECTOR EyePosition, // Input camera position Q
FXMVECTOR FocusPosition, // Input target point T
FXMVECTOR UpDirection); // Input world up vector j


一般世界y轴对应于“Up”方向,因此,“Up”矢量几乎总是J =(0,1,0)。作为一个例子,假设我们希望相对于世界空间摄像头位于(5,3,-10),并且照相机指向世界原点(0,0,0)。我们可以建立视图矩阵如下:


XMVECTOR pos = XMVectorSet(5, 3, -10, 1.0f);
XMVECTOR target = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMMATRIX V = XMMatrixLookAtLH(pos, target, up);