视图转换 (Direct3D 9)

本部分介绍视图转换的基本概念,并详细介绍了如何在 Direct3D 应用程序中设置视图转换矩阵。

视图转换将查看器定位到世界空间,将顶点转换为相机空间。 在相机空间中,相机或查看器位于原点,从正 z 方向看。 回想一下,Direct3D 使用左手坐标系,因此 z 在场景中是积极的。 视图矩阵将物体重新定位到相机的位置(相机空间的原点)和方向。

有多种方法可以创建视图矩阵。 在所有情况下,相机在世界空间中都有一些逻辑位置和方向,用作创建将应用于场景中模型的视图矩阵的起点。 视图矩阵转换和旋转对象以将它们放置在相机空间中,相机位于原点。 创建视图矩阵的一种方法是将转换矩阵与每个轴的旋转矩阵组合在一起。 在此方法中,将应用以下一般矩阵公式。

视图转换公式

在此公式中,V 是正在创建的视图矩阵,T 是一个转换矩阵,用于重新定位世界中的对象,Rₓ 通过 Rz 是沿 x 轴、y 轴和 z 轴旋转对象的旋转矩阵。 翻译和旋转矩阵基于相机在世界空间中的逻辑位置和方向。 因此,如果相机在世界上的逻辑位置 <10,20,100>,则转换矩阵的目标是沿 x 轴移动对象 -10 单位,沿 y 轴 -20 单位,沿 z 轴移动 -100 单位。 公式中的旋转矩阵基于相机的方向,根据相机空间轴与世界空间的对齐方式旋转多少。 例如,如果前面提到的相机直下,则其 z 轴为 90 度(pi/2 弧度),与世界空间的 z 轴对齐,如下图所示。

与世界空间相比,相机视图空间的 插图

旋转矩阵对场景中的模型应用相同但相反的旋转。 此相机的视图矩阵包括围绕 x 轴的 -90 度旋转。 旋转矩阵与转换矩阵相结合,创建一个视图矩阵,该矩阵调整场景中对象的位置和方向,以便其顶部面向相机,使相机在模型上方的外观。

设置视图矩阵

D3DXMatrixLookAtLHD3DXMatrixLookAtRH 帮助程序函数基于相机位置和查看点创建视图矩阵。

以下示例为左侧坐标创建视图矩阵。

D3DXMATRIX out;
D3DXVECTOR3 eye(2,3,3);
D3DXVECTOR3 at(0,0,0);
D3DXVECTOR3 up(0,1,0);
D3DXMatrixLookAtLH(&out, &eye, &at, &up);

Direct3D 使用世界和视图矩阵来配置多个内部数据结构。 每次设置新的世界或视图矩阵时,系统都会重新计算关联的内部结构。 频繁设置这些矩阵非常耗时。 通过将世界和视图矩阵串联为世界视图矩阵,然后将视图矩阵设置为世界矩阵,然后将视图矩阵设置为标识,可以最大程度地减少所需计算的数量。 保留单个世界和视图矩阵的缓存副本,以便根据需要修改、连接和重置世界矩阵。 为了清楚起见,这些示例很少采用这种优化。

转换