Win10系列:VC++ Direct3D图形绘制1
通过前面的介绍,相信读者已经了解了如何新建一个用于开发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的更多相关文章
- Win10系列:JavaScript图形
在页面中添加canvas元素会在页面上生成一个矩形的位图画布,可以使用JavaScript在画布上实时绘制图形图像.在绘制图形时,需要先调用画布的getContext函数获取与该画布相关的用于绘制图形 ...
- vc程序设计--图形绘制1
利用绘图函数创建填充区.Windows通过使用当前画笔画一个图形的边界,然后用当前的刷子填充这个图形来创建-一个填充图形.共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮 ...
- vc程序设计--图形绘制2
// 实验2.cpp : 定义应用程序的入口点. // #include "framework.h" #include "实验2.h" #define MAX_ ...
- Win10系列:VC++ Direct3D开发基础1
在介绍如何使用Direct3D项目模版来绘制立体图形之前,首先为读者介绍在Direct3D应用程序开发过程中涉及到的一些常用概念. (1)资源 资源是指可以被Direct3D图形管线所访问的内存空间, ...
- Win10系列:VC++ Direct3D模板介绍3
(4)Render函数 默认定义在CubeRenderer.cpp源文件中的Render函数用于绘制立体图形,此函数的实现代码如下所示: void CubeRenderer::Render() { ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列六》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- CSS 魔法系列:纯 CSS 绘制图形(各种形状的钻石)
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
随机推荐
- ISNULL函数的深入讲解
1. 标题有点夸张 2. 今天做统计查询员工加班时长的时,因为要将NULL值导入到decimal类型的字段中,但是发现导入之后得字段不属于NULL也不等于0,因此在接下来的运算过程中就很难继续进行, ...
- Java——文件及目录File操作
API file.listFiles(); //列出目录下所有文件及子目录fileList[i].isFile() //判断是否为文件 fileList[i].isDirectory() //判断是否 ...
- leecode第一百三十六题(只出现一次的数字)
class Solution { public: int singleNumber(vector<int>& nums) { int len=nums.size(); ; ;i&l ...
- leecode第十一题(盛最多水的容器)
class Solution { public: int maxArea(vector<int>& height) { int len=height.size();//错过,少了i ...
- 《剑指offer》第五十九题(滑动窗口的最大值)
// 面试题59(一):滑动窗口的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的 ...
- 淘宝开源的H5移动开发UI框架genie-ui
官网地址: https://npm.taobao.org/package/genie-ui
- Codeforces 801B - Valued Keys
B. Valued Keys 题目链接:http://codeforces.com/contest/801/problem/B time limit per test 2 seconds memory ...
- Java中 Tomcat 是干什么的?
Tomcat是web容器.它的作用稍后给你解释. 你在做web项目时,多数需要http协议,也就是基于请求和响应,比如你在百度输入一行内容搜索, 那么百度服务器如何处理这个请求呢,他需要创建servl ...
- mui 访问系统相册将图片显示到网页
访问系统相返回值为一个对象,通过转换为字符串可以查看,path.files[0]为返回路径去除路径赋值到src 调用摄像头返回的相片的path为一个路径通过 plus.io.resolveLocalF ...
- python sshtunnel 简单介绍
背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 安装 pip3. ...