DX学习笔记(创建DX自带几何体)
可参考之前博客写的一个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自带几何体)相关推荐
- 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集
Result学习笔记(三)带參数的结果集 第一部分:代码 //前端 <head> <meta http-equiv="Content-Type" content= ...
- golang游戏开发学习笔记-创建一个能自由探索的3D世界
此文写在golang游戏开发学习笔记-用golang画一个随时间变化颜色的正方形之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里,我们将创建一个非常简单(只有三个方块)但能自由探索的的3D世 ...
- 莫队算法学习笔记(二)——带修莫队
前言:什么是莫队 莫队算法,是一个十分优雅的暴力. 普通的莫队可以轻松解决一些离线问题,但是,当遇上了一些有修改操作的问题,普通莫队就无能为力了. 于是,改进后的莫队--带修莫队就这样产生了. L i ...
- DX学习笔记之Surfaces
声明:本文完全翻译自DX SDK Documentation 一个surface代表了显存中的一块线性区域,通常在显卡的显存中,尽管surface也可以存在系统内存中.surface是被IDirect ...
- EntityFramework Core 学习笔记 —— 创建模型
原文地址:https://docs.efproject.net/en/latest/modeling/index.html 前言: EntityFramework 使用一系列的约定来从我们的实体类细节 ...
- pixhawk学习笔记---创建新的应用程序
最近转到无人机领域的开发中,感觉和以往搞android驱动差别比较大,以前搞android驱动的时候网上的资料满天飞,但是现在关于飞控相关的资料却少之又少,一些资料都是从原理上入手,讲的是天花乱坠,看 ...
- 4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]
2019独角兽企业重金招聘Python工程师标准>>> 创建自定义指令 注意:本指南是针对已经熟悉AngularJS基础的开发者.如果您只是想要开始,建议您先去看教程.如果你在寻找指 ...
- Nhibernate 3.0 cookbook学习笔记 创建事务自动包裹的访问层
Nhibernate中,一般我们用session对数据进行增删改查时都要将session包装在一个事务()中,类似下面的代码: using (var tx = session.BeginTransac ...
- 日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用
winston 被设计为一个简单且通用的日志库,支持多种传输. 传输本质上是日志的存储设备. 每个 winston 记录器都可以在不同级别配置多个存储渠道.例如,人们可能希望将错误日志存储在持久的远程 ...
最新文章
- unity 关闭自己脚本_Unity3D 挂载的脚本取消勾选居然还会运行!!
- osi7层协议源代码_捍卫开放源代码的17年:立即加入OSI
- 简单的php文件_简单的php文件上传(实例)
- 红黑树的红黑有什么意义_红枸杞和黑枸杞有什么不同?黑枸杞真的比红枸杞要好吗?...
- 小tips:JS语法之标签(label)
- 教老年人计算机心得体会,老年人教育工作心得体会
- 49.把字符串转换成整数
- 使用MyBatis select数据库查出有数据 但返回对象为null时的解决办法
- knockout.js的学习笔记3
- adb网络连接调试,重启之后失效
- 图形界面介绍——Select键
- 基础数学4:导数、偏导数、方向导数、梯度、全微分回顾
- 1125: 上三角矩阵的判断
- sql查询每科成绩最高的人和分数
- 双硬盘双系统解决引导在同一个分区的问题
- 朽木第一至三季/全集Deadwood迅雷下载
- 自动识别快递公司,教你快递查询单号查询物流
- 2021山师高考联考成绩查询,点击关注:2021五岳联考阅卷成绩查询入口
- 转载 钽电容起火、钽电容爆炸、钽电容烧了
- 作为 Android 开发者,如何深入学习 Android UI?