可参考之前博客写的一个demo

http://blog.csdn.net/zero_witty/article/details/51651162

demo的主要内容在框架函数Setup(),Display()两个上,其余的函数跟其他demo的函数一致,故不在细究。

首先设置全局变量,设置5个对象去代表每个几何体的网格元素,定义个世界矩阵,去代表其各自的在世界坐标系的坐标。

ID3DXMesh* Objects[5] = { 0, 0, 0, 0, 0 };D3DXMATRIX ObjWorldMatrices[5];

Setup()函数主要完成了
通过自定的D3DXCreateXXX()函数(在代码注释里解释了每个函数的参数意思)去创建自带的几何体,并为每个几何体的世界矩阵进行填充。并设置投影矩阵,并选择线框模式渲染。

bool Setup()
{D3DXCreateTeapot(Device, &Objects[0], 0);D3DXCreateBox(Device, 2.0f, 2.0f, 2.0f, &Objects[1], 0);/*   HRESULT  D3DXCreateBox(__in   LPDIRECT3DDEVICE9 pDevice,//Direct3D设备对象__in   FLOAT Width, //盒子的宽度__in   FLOAT Height,//盒子的高度__in   FLOAT Depth,//盒子的深度__out  LPD3DXMESH *ppMesh,//存储着盒子网格的指针__out  LPD3DXBUFFER *ppAdjacency//存储三角形索引的指针);*/// cylinder is built aligned on z-axisD3DXCreateCylinder(Device, 1.0f, 1.0f, 3.0f, 10, 10, &Objects[2], 0);/*HRESULT  D3DXCreateCylinder(__in   LPDIRECT3DDEVICE9 pDevice,__in   FLOAT Radius1,  //创建的柱体沿Z轴负方向半径的大小__in   FLOAT Radius2,  //创建的柱体沿Z轴正方向半径的大小__in   FLOAT Length,  //创建的柱体沿Z轴方向的长度。__in   UINT Slices,  //表示柱体外围有几个面__in   UINT Stacks,  //柱体两端间共有几段__out  LPD3DXMESH *ppMesh,  //存储柱体的指针__out  LPD3DXBUFFER *ppAdjacency//绘制 网格存储的三角形索引的指针);*///创建圆环D3DXCreateTorus(Device, 1.0f, 3.0f, 10, 10, &Objects[3], 0);/*HRESULT  D3DXCreateTorus(__in   LPDIRECT3DDEVICE9 pDevice,__in   FLOAT InnerRadius,  //内圈半径__in   FLOAT OuterRadius,  //外圈半径__in   UINT Sides, //外圈有几个面__in   UINT Rings,  //内圈与外圈之间共有几个面__out  LPD3DXMESH *ppMesh,__out  LPD3DXBUFFER *ppAdjacency);*/D3DXCreateSphere(Device,1.0f,10,10, &Objects[4],0);/*HRESULT  D3DXCreateSphere(  __in   LPDIRECT3DDEVICE9 pDevice,  __in   FLOAT Radius,  //球面半径__in   UINT Slices,  //用几条经线绘制__in   UINT Stacks,  //用几条纬线绘制__out  LPD3DXMESH *ppMesh,  __out  LPD3DXBUFFER *ppAdjacency  );  */D3DXMatrixTranslation(&ObjWorldMatrices[0], 0.0f, 0.0f, 0.0f);D3DXMatrixTranslation(&ObjWorldMatrices[1], -5.0f, 0.0f, 5.0f);D3DXMatrixTranslation(&ObjWorldMatrices[2], 5.0f, 0.0f, 5.0f);D3DXMatrixTranslation(&ObjWorldMatrices[3], -5.0f, 0.0f, -5.0f);D3DXMatrixTranslation(&ObjWorldMatrices[4], 5.0f, 0.0f, -5.0f);//设置投影矩阵D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI * 0.5f,(float)Width / (float)Height,1.0f,1000.0f);Device->SetTransform(D3DTS_PROJECTION, &proj);Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);return true;
}

Display()函数设置了一个动画镜头。摄像机将会绕着场景中心环绕。我们使用sin,cos去生成圆上的一点,将其扩大十倍去延展到环绕圈的半径上。此外,相机会向上或向下移动,因为相机环绕着场景。

bool Display(float timeDelta)
{if (Device){static float angle = (3.0f*D3DX_PI) / 2.0f;static float cameraHeight = 0.0f;static float cameraHeightDirection = 2.0f;D3DXVECTOR3 position(cosf(angle)*10.0f, cameraHeight, sinf(angle)*10.0f);D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);D3DXMATRIX V;D3DXMatrixLookAtLH(&V, &position, &target, &up);Device->SetTransform(D3DTS_VIEW, &V);angle += timeDelta;if (angle >= 6.28f)angle = 0.0f;cameraHeight += cameraHeightDirection*timeDelta;if (cameraHeight >= 10.0f)cameraHeightDirection = -2.0f;if (cameraHeight <= -10.0f)cameraHeightDirection = 2.0f;Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);Device->BeginScene();for (int i = 0; i < 5; i++){Device->SetTransform(D3DTS_WORLD, &ObjWorldMatrices[i]);Objects[i]->DrawSubset(0);}Device->EndScene();Device->Present(0, 0, 0, 0);}return true;
}

完整代码,其中不包含d3dUtility.cpp,d3dUtility.h(可以去此链接自行获取 http://blog.csdn.net/zero_witty/article/details/51627916)

d3dcreate.cpp

#include "d3dUtility.h"IDirect3DDevice9*     Device = 0;const int Width = 640;
const int Height = 480;ID3DXMesh* Objects[5] = { 0, 0, 0, 0, 0 };D3DXMATRIX ObjWorldMatrices[5];
//每个对象的世界矩阵,表明他们在世界坐标系的坐标bool Setup()
{D3DXCreateTeapot(Device, &Objects[0], 0);D3DXCreateBox(Device, 2.0f, 2.0f, 2.0f, &Objects[1], 0);/*   HRESULT  D3DXCreateBox(__in   LPDIRECT3DDEVICE9 pDevice,//Direct3D设备对象__in   FLOAT Width, //盒子的宽度__in   FLOAT Height,//盒子的高度__in   FLOAT Depth,//盒子的深度__out  LPD3DXMESH *ppMesh,//存储着盒子网格的指针__out  LPD3DXBUFFER *ppAdjacency//存储三角形索引的指针);*/// cylinder is built aligned on z-axisD3DXCreateCylinder(Device, 1.0f, 1.0f, 3.0f, 10, 10, &Objects[2], 0);/*HRESULT  D3DXCreateCylinder(__in   LPDIRECT3DDEVICE9 pDevice,__in   FLOAT Radius1,  //创建的柱体沿Z轴负方向半径的大小__in   FLOAT Radius2,  //创建的柱体沿Z轴正方向半径的大小__in   FLOAT Length,  //创建的柱体沿Z轴方向的长度。__in   UINT Slices,  //表示柱体外围有几个面__in   UINT Stacks,  //柱体两端间共有几段__out  LPD3DXMESH *ppMesh,  //存储柱体的指针__out  LPD3DXBUFFER *ppAdjacency//绘制 网格存储的三角形索引的指针);*///创建圆环D3DXCreateTorus(Device, 1.0f, 3.0f, 10, 10, &Objects[3], 0);/*HRESULT  D3DXCreateTorus(__in   LPDIRECT3DDEVICE9 pDevice,__in   FLOAT InnerRadius,  //内圈半径__in   FLOAT OuterRadius,  //外圈半径__in   UINT Sides, //外圈有几个面__in   UINT Rings,  //内圈与外圈之间共有几个面__out  LPD3DXMESH *ppMesh,__out  LPD3DXBUFFER *ppAdjacency);*/D3DXCreateSphere(Device,1.0f,10,10, &Objects[4],0);/*HRESULT  D3DXCreateSphere(  __in   LPDIRECT3DDEVICE9 pDevice,  __in   FLOAT Radius,  //球面半径__in   UINT Slices,  //用几条经线绘制__in   UINT Stacks,  //用几条纬线绘制__out  LPD3DXMESH *ppMesh,  __out  LPD3DXBUFFER *ppAdjacency  );  */D3DXMatrixTranslation(&ObjWorldMatrices[0], 0.0f, 0.0f, 0.0f);D3DXMatrixTranslation(&ObjWorldMatrices[1], -5.0f, 0.0f, 5.0f);D3DXMatrixTranslation(&ObjWorldMatrices[2], 5.0f, 0.0f, 5.0f);D3DXMatrixTranslation(&ObjWorldMatrices[3], -5.0f, 0.0f, -5.0f);D3DXMatrixTranslation(&ObjWorldMatrices[4], 5.0f, 0.0f, -5.0f);//设置投影矩阵D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI * 0.5f,(float)Width / (float)Height,1.0f,1000.0f);Device->SetTransform(D3DTS_PROJECTION, &proj);Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);return true;
}
void Cleanup()
{for (int i = 0; i < 5; i++)d3d::Release<ID3DXMesh*>(Objects[i]);
}bool Display(float timeDelta)
{if (Device){static float angle = (3.0f*D3DX_PI) / 2.0f;static float cameraHeight = 0.0f;static float cameraHeightDirection = 2.0f;D3DXVECTOR3 position(cosf(angle)*10.0f, cameraHeight, sinf(angle)*10.0f);D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);D3DXMATRIX V;D3DXMatrixLookAtLH(&V, &position, &target, &up);Device->SetTransform(D3DTS_VIEW, &V);angle += timeDelta;if (angle >= 6.28f)angle = 0.0f;cameraHeight += cameraHeightDirection*timeDelta;if (cameraHeight >= 10.0f)cameraHeightDirection = -2.0f;if (cameraHeight <= -10.0f)cameraHeightDirection = 2.0f;Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);Device->BeginScene();for (int i = 0; i < 5; i++){Device->SetTransform(D3DTS_WORLD, &ObjWorldMatrices[i]);Objects[i]->DrawSubset(0);}Device->EndScene();Device->Present(0, 0, 0, 0);}return true;
}LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_DESTROY:::PostQuitMessage(0);break;case WM_KEYDOWN:if (wParam == VK_ESCAPE)::DestroyWindow(hwnd);break;}return ::DefWindowProc(hwnd, msg, wParam, lParam);
}int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd)
{if (!d3d::InitD3D(hinstance, Width, Height, true, D3DDEVTYPE_HAL, &Device)){::MessageBox(0, "InitD3D() - FAILED", 0, 0);return 0;}if (!Setup()){::MessageBox(0, "Setup() - FAILED", 0, 0);return 0;}d3d::EnterMsgLoop(Display);Cleanup();Device->Release();return 0;
}

DX学习笔记(创建DX自带几何体)相关推荐

  1. 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集

    Result学习笔记(三)带參数的结果集 第一部分:代码 //前端 <head> <meta http-equiv="Content-Type" content= ...

  2. golang游戏开发学习笔记-创建一个能自由探索的3D世界

    此文写在golang游戏开发学习笔记-用golang画一个随时间变化颜色的正方形之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里,我们将创建一个非常简单(只有三个方块)但能自由探索的的3D世 ...

  3. 莫队算法学习笔记(二)——带修莫队

    前言:什么是莫队 莫队算法,是一个十分优雅的暴力. 普通的莫队可以轻松解决一些离线问题,但是,当遇上了一些有修改操作的问题,普通莫队就无能为力了. 于是,改进后的莫队--带修莫队就这样产生了. L i ...

  4. DX学习笔记之Surfaces

    声明:本文完全翻译自DX SDK Documentation 一个surface代表了显存中的一块线性区域,通常在显卡的显存中,尽管surface也可以存在系统内存中.surface是被IDirect ...

  5. EntityFramework Core 学习笔记 —— 创建模型

    原文地址:https://docs.efproject.net/en/latest/modeling/index.html 前言: EntityFramework 使用一系列的约定来从我们的实体类细节 ...

  6. pixhawk学习笔记---创建新的应用程序

    最近转到无人机领域的开发中,感觉和以往搞android驱动差别比较大,以前搞android驱动的时候网上的资料满天飞,但是现在关于飞控相关的资料却少之又少,一些资料都是从原理上入手,讲的是天花乱坠,看 ...

  7. 4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]

    2019独角兽企业重金招聘Python工程师标准>>> 创建自定义指令 注意:本指南是针对已经熟悉AngularJS基础的开发者.如果您只是想要开始,建议您先去看教程.如果你在寻找指 ...

  8. Nhibernate 3.0 cookbook学习笔记 创建事务自动包裹的访问层

    Nhibernate中,一般我们用session对数据进行增删改查时都要将session包装在一个事务()中,类似下面的代码: using (var tx = session.BeginTransac ...

  9. 日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用

    winston 被设计为一个简单且通用的日志库,支持多种传输. 传输本质上是日志的存储设备. 每个 winston 记录器都可以在不同级别配置多个存储渠道.例如,人们可能希望将错误日志存储在持久的远程 ...

最新文章

  1. unity 关闭自己脚本_Unity3D 挂载的脚本取消勾选居然还会运行!!
  2. osi7层协议源代码_捍卫开放源代码的17年:立即加入OSI
  3. 简单的php文件_简单的php文件上传(实例)
  4. 红黑树的红黑有什么意义_红枸杞和黑枸杞有什么不同?黑枸杞真的比红枸杞要好吗?...
  5. 小tips:JS语法之标签(label)
  6. 教老年人计算机心得体会,老年人教育工作心得体会
  7. 49.把字符串转换成整数
  8. 使用MyBatis select数据库查出有数据 但返回对象为null时的解决办法
  9. knockout.js的学习笔记3
  10. adb网络连接调试,重启之后失效
  11. 图形界面介绍——Select键
  12. 基础数学4:导数、偏导数、方向导数、梯度、全微分回顾
  13. 1125: 上三角矩阵的判断
  14. sql查询每科成绩最高的人和分数
  15. 双硬盘双系统解决引导在同一个分区的问题
  16. 朽木第一至三季/全集Deadwood迅雷下载
  17. 自动识别快递公司,教你快递查询单号查询物流
  18. 2021山师高考联考成绩查询,点击关注:2021五岳联考阅卷成绩查询入口
  19. 转载 钽电容起火、钽电容爆炸、钽电容烧了
  20. 作为 Android 开发者,如何深入学习 Android UI?

热门文章

  1. 在同一个局域网和在不同的局域网,电脑之间的网络通讯原理
  2. 高中英语教师个人研修计划
  3. 《电路基础》电阻|电容|电感公式备忘
  4. IText生成PDF删除与合并
  5. CodeForces - 589J Cleaner Robot
  6. python的内置装饰器
  7. 制作学术PPT和演讲的要点
  8. Docker 入门到精通 (图解+秒懂+史上最全)
  9. uart口图片_uart接口有什么特点与功能
  10. 计算机学院毕业条幅,大学毕业季聚餐条幅标语