通过前面的介绍,相信读者已经了解了如何新建一个用于开发Direct3D应用程序的项目模版,以及这个项目模版中用于绘制立体图形的主要函数。在本小节中,将通过一个具体的示例来介绍如何使用Visual Studio提供的Direct3D项目模版来绘制一个立体三角形,并使此立体三角形绕X轴进行旋转。
在Visual Studio中新建一个Visual C++的Windows应用商店的Direct3D应用程序项目,将其命名为Direct3DDraw。打开CubeRenderer.cpp源文件,修改CreateDeviceResources函数中cubeVertices数组所保存的立体图形顶点位置和颜色信息,cubeVertices数组的代码如下所示:
//定义数组cubeVertices
VertexPositionColor cubeVertices[] =
{
//0顶点的位置和颜色信息
{XMFLOAT3(0.0f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
//1顶点的位置和颜色信息
{XMFLOAT3(0.5f, -0.5f, 0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
//2顶点的位置和颜色信息
{XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
//3顶点的位置和颜色信息
{XMFLOAT3(0.0f, 0.5f, 0.0f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
};
在上面的代码中,cubeVertices数组保存了立体三角形四个顶点的位置和颜色信息,关于这些信息的具体说明可参照20.8.2小节中对创建立体图形顶点的介绍。其中cubeVertices数组中的第一个数组元素所保存的顶点的索引为0,后面的三个数组元素所保存的顶点的索引依次为1、2和3。
修改了cubeVertices数组所保存的立体图形顶点位置和颜色信息以后,接下来在CreateDeviceResources函数中继续修改cubeIndices数组所保存的顶点索引,以便能正确地绘制出此立体三角形。修改后,cubeIndices数组的代码如下所示:
//定义数组cubeIndices
unsigned short cubeIndices[] =
{
0,1,3,
3,1,2,
2,0,3,
2,1,0
};
在上面的代码中,cubeIndices数组保存了用于绘制立体三角形的12个顶点索引,其中从cubeIndices数组的第一个数组元素所保存的顶点索引开始,每三个相邻的顶点索引用于绘制立体三角形的一个面。
修改了上述的代码以后,运行项目,将在应用窗口中绘制如图20-23所示的立体三角形。
图20-23 Direct3D绘制的立体三角形
上面示例所创建的立体三角形默认绕Y轴旋转,可以通过调用XMMatrixRotationX、XMMatrixRotationY和XMMatrixRotationZ这三个函数来设置世界矩阵,从而使立体三角形绕着特定的坐标轴旋转。
接下来介绍如何使前面所绘制的立体三角形绕X轴旋转。在CubeRenderer.cpp源文件中修改model结构体变量的值,修改后的Update函数如下所示:
void CubeRenderer::Update(float timeTotal, float timeDelta)
{
// 未使用的参数
(void) timeDelta;
//观察视点的位置,X=0.0,Y=0.7,Z=3.0,W=0.0
XMVECTOR eye = XMVectorSet(0.0f, 0.7f, 1.5f, 0.0f);
//观察视点的位置,X=0.0,Y=0.0,Z=0.0,W=0.0
XMVECTOR at = XMVectorSet(0.0f, -0.1f, 0.0f, 0.0f);
//观察视点的向上向量,X=0.0,Y=0.5,Z=0.0,W=0.0
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
//设置观察视点
XMStoreFloat4x4(&m_constantBufferData.view, XMMatrixTranspose(XMMatrixLookAtRH(eye, at, up)));
//设置世界矩阵
XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationX(timeTotal * XM_PIDIV4)));
}
在上面的代码中,以参数timeTotal乘以常量XM_PIDIV4得到的值作为参数调用XMMatrixRotationX函数,得到一个绕X轴的旋转矩阵,然后以这个旋转矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵,最后通过XMStoreFloat4x4函数将这个转置矩阵存储到model结构体变量中。
运行项目后,可以在应用窗口中看到原本绕Y轴旋转的立体三角形将绕X轴不断地旋转。