本教程介绍了矩阵的概念并展示了如何使用它们。 Vertices 示例项目渲染 2D 顶点以绘制三角形。 但是,在本教程中,您将使用 3D 中的顶点变换。 矩阵也用于设置相机和视口。
在 Matrices 示例项目渲染几何之前,它调用 SetupMatrices 应用程序定义的函数来创建和设置用于渲染 3D 三角形的矩阵变换。 通常,为 3D 场景设置三种类型的变换。 下面列出了创建这些典型转换中的每一个的步骤。
脚步
- 第 1 步 - 定义世界转换矩阵
- 第 2 步 - 定义视图转换矩阵
- 第 3 步 - 定义投影变换矩阵
创建这些变换矩阵的顺序不会影响场景中对象的布局。 但是,Direct3D 按以下顺序将矩阵应用于场景:世界、视图、投影
Matrices 示例项目的路径是:
(SDK 根目录)\Samples\C++\Direct3D\Tutorials\Tut03_MatricesMatrices 项目中的示例代码与 Vertices 项目中的示例代码几乎相同。 >Using Matrices 教程只关注矩阵特有的代码,不包括初始化 Direct3D、处理 Windows 消息、呈现或关闭。
第 1 步 - 定义世界转换矩阵
世界变换矩阵定义了如何在 3D 模型空间中平移、缩放和旋转几何体。
以下代码片段在 y 轴上旋转三角形,然后为 Direct3D 设备设置当前世界变换。
D3DXMATRIX matWorld;
D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
第一步是通过调用 D3DXMatrixRotationY 方法围绕 y 轴旋转三角形。 第一个参数是指向作为操作结果的 D3DXMATRIX 结构的指针。 第二个参数是以弧度为单位的旋转角度。
下一步是调用 IDirect3DDevice9::SetTransform 来设置 Direct3D 设备的世界变换。 IDirect3DDevice9::SetTransform 接受的第一个参数告诉 Direct3D 设置哪个转换。 此示例使用 D3DTS_WORLD 宏来指定应设置世界变换。 第二个参数是指向设置为当前变换的矩阵的指针。
有关世界变换的详细信息,请参阅世界变换 (Direct3D 9)。
在为场景定义了世界变换之后,您可以准备视图变换矩阵。 再次注意,定义转换的顺序并不重要。 但是,Direct3D 按以下顺序将矩阵应用于场景:世界、视图、投影
定义视图变换矩阵在步骤 2 - 定义视图变换矩阵中进行了描述。
第 2 步 - 定义视图转换矩阵
视图变换矩阵定义了视图的位置和旋转。 视图矩阵是场景的相机。
以下代码片段创建视图转换矩阵,然后为 Direct3D 设备设置当前视图转换。
D3DXVECTOR3 vEyePt ( 0.0f, 3.0f,-5.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec ( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
第一步是通过调用 D3DXMatrixLookAtLH 来定义视图矩阵。第一个参数是指向作为操作结果的 D3DXMATRIX 结构的指针。第二、第三和第四个参数分别定义了眼点、注视点和“向上”方向。此处,眼睛沿 z 轴向后移动 5 个单位,向上移动 3 个单位,观察点设置在原点,“向上”定义为 y 方向。
下一步是调用 IDirect3DDevice9::SetTransform 来设置 Direct3D 设备的视图转换。 IDirect3DDevice9::SetTransform 接受的第一个参数告诉 Direct3D 设置哪个转换。此示例使用 D3DTS_VIEW 标志来指定应设置视图转换。第二个参数是指向设置为当前变换的矩阵的指针。
有关视图变换的详细信息,请参阅视图变换 (Direct3D 9)。
定义好场景的世界变换后,就可以准备投影变换矩阵了。再次注意,定义转换的顺序并不重要。但是,Direct3D 按以下顺序将矩阵应用于场景:世界、视图、投影
定义投影变换矩阵在步骤 3 - 定义投影变换矩阵中进行了描述。
第 3 步 - 定义投影变换矩阵
投影变换矩阵定义几何如何从 3D 视图空间转换到 2D 视口空间。
以下代码片段创建投影变换矩阵,然后为 Direct3D 设备设置当前投影变换。
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
第一步是调用 D3DXMatrixPerspectiveFovLH 来设置投影矩阵。第一个参数是指向作为操作结果的 D3DXMATRIX 结构的指针。第二个参数定义了视野,它告诉远处的物体如何变小。典型的视野是 1/4 pi,这是样本使用的。第三个参数定义纵横比。该示例使用 1 的典型纵横比。第四个和第五个参数定义了近剪裁平面和远剪裁平面。这决定了不再渲染几何体的距离。矩阵示例项目的近裁剪平面设置为 1,远裁剪平面设置为 100。
下一步是调用 IDirect3DDevice9::SetTransform 将转换应用到 Direct3D 设备。 IDirect3DDevice9::SetTransform 接受的第一个参数告诉 Direct3D 设置哪个转换。此示例使用 D3DTS_PROJECTION 标志来指定应设置投影变换。第二个参数是指向设置为当前变换的矩阵的指针。
有关投影变换的详细信息,请参阅投影变换 (Direct3D 9)。
本教程向您展示了如何使用矩阵。教程 4:创建和使用灯光展示了如何将灯光添加到场景中以获得更真实的效果。
运行效果: