通过前面的介绍,相信读者已经了解了如何新建一个用于开发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轴不断地旋转。

Win10系列:VC++ Direct3D图形绘制1的更多相关文章

  1. Win10系列:JavaScript图形

    在页面中添加canvas元素会在页面上生成一个矩形的位图画布,可以使用JavaScript在画布上实时绘制图形图像.在绘制图形时,需要先调用画布的getContext函数获取与该画布相关的用于绘制图形 ...

  2. vc程序设计--图形绘制1

        利用绘图函数创建填充区.Windows通过使用当前画笔画一个图形的边界,然后用当前的刷子填充这个图形来创建-一个填充图形.共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮 ...

  3. vc程序设计--图形绘制2

    // 实验2.cpp : 定义应用程序的入口点. // #include "framework.h" #include "实验2.h" #define MAX_ ...

  4. Win10系列:VC++ Direct3D开发基础1

    在介绍如何使用Direct3D项目模版来绘制立体图形之前,首先为读者介绍在Direct3D应用程序开发过程中涉及到的一些常用概念. (1)资源 资源是指可以被Direct3D图形管线所访问的内存空间, ...

  5. Win10系列:VC++ Direct3D模板介绍3

    (4)Render函数 默认定义在CubeRenderer.cpp源文件中的Render函数用于绘制立体图形,此函数的实现代码如下所示: void CubeRenderer::Render() {   ...

  6. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  7. CSS 魔法系列:纯 CSS 绘制各种图形《系列六》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  8. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  9. CSS 魔法系列:纯 CSS 绘制图形(各种形状的钻石)

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

随机推荐

  1. vue init webpack nameXXX 报错问题:

    vue新建demo项目报错如下: M:\lhhVueTest>vue init webpack L21_VueProject vue-cli · Failed to download repo ...

  2. Android JNI 数组操作

    JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的. 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基 ...

  3. sort-选择排序

    void sort_select(vector<int> &v) { for(int i=0;i<v.size()-1;i++) { int min=v[i]; int in ...

  4. node+ts的心得与坑

    首先先明确,用node+ts的目的,为什么不ng+ts.这一点后面还会反复提醒自己 node毕竟不是ng. 用node的理由: 处理js,在后端操纵dom,读写类html格式的东西,比直接用py的后端 ...

  5. java线程执行的优先级

    1.1      线程的优先级 java 中的线程优先级的范围是1-10,默认的优先级是5.10极最高. 有时间片轮循机制.“高优先级线程”被分配CPU的概率高于“低优先级线程”.根据时间片轮循调度, ...

  6. SQLSERVER 和 ORACLE的if not exist 用法

    sql server: if not exists (select 1 from TB_Procedure where Id='2018ZZZ') BEGIN insert into TB_Proce ...

  7. Ubuntu vim终端常用的快捷键

    Ubuntu中常用的快捷键 Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手.在Ubuntu中打开终端的快捷键是Ctrl+Alt+T.其他的一些常用的快捷 ...

  8. 通过.frm和.ibd恢复mysql数据

    .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per_table = 1)产生的存放该表的数据和索 ...

  9. 『MXNet』第二弹_Gluon构建模型

    上节用了Sequential类来构造模型.这里我们另外一种基于Block类的模型构造方法,它让构造模型更加灵活,也将让你能更好的理解Sequential的运行机制. 回顾: 序列模型生成 层填充 初始 ...

  10. 第二类Stirling数

    第二类斯特林数 第二类Stirling数:S2(p, k) 1.组合意义:第二类Stirling数计数的是把p个互异元素划分为k个非空集合的方法数 2.递推公式: S2(0, 0) = 1 S2(p, ...