




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DX三维文字及地形场景实验实验报告一、 实验目的(1) 通过实验,运用DirectX三维图形编程的知识、原理和技术;(2) 掌握在综合三维场景的基础上,设计一个三维文字及地形的实现方法;(3) 通过使用VC+编程环境实现三维场景中的三维文字及地形的设计;二、 实验内容和要求(1) 在VC+编程环境下建立三维场景,场景中包括:1. 茶壶模型、圆柱体模型。2. 茶壶模型使用黄色材质。3. 圆柱体模型使用纹理贴图材质。4. 设置一个电光源灯光系统。(2) 在VC+编程环境下建立一个三维文字及地形的设计。1. 在三维场景中,使用地形文件建立一个三维地形。2. 同时输出三维文字,文字内容包括:学生名字、学号。3. 要求能够使用粒子系统实现烟火/雪花等特效。三、 实验主要仪器设备和材料计算机,VC2005语言程序设计环境 和DirectX 三维图形开发环境。四、 实验原理D3DX库是使用ID3DXFont接口来在Direct3D应用程序中输出文字的。这个接口通过GDI(图形设备接口)来输出文字,因此用这个接口完成任务的时候会有些效率上的损失。但是,运用了GDI,ID3DXFont可以处理复杂的文字和文字格式。在DirectX中通过D3DXCreateFontIndirect方法来创建一个ID3DXFont接口: HRESULTWINAPID3DXCreateFontIndirect( LPDIRECT3DDEVICE9pDevice,/ 当前所使用的设备 CONST D3DXFONT_DESC*pDesc, / 字体描述结构 LPD3DXFONT*ppFont/ 返回的字体接口 );当获得了一个ID3DXFont接口以后,可以方便地利用ID3DXFont接口的DrawText方法来输出文字: INT ID3DXFont:DrawText( LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color );范例代码如下: Font-DrawText( Hello World, / 待输出字符串 -1, / NULL结尾(Null terminating)的字符串 &rect, / 决定文字输出到屏幕的位置 DT_TOP | DT_LEFT, / 在指定RECT的左上角输出 0xff000000/ 文字颜色:黑色 ); 用具有不同高度、不同颜色的三角形网格来创建高山和低谷,以此模拟一个真实的地形。高度图是一个储存了地形各个顶点高度数据的数据集合。可以用硬盘上的图片来为地形加上纹理,也可以用程序生成地形纹理。通过计算每个方格的阴影因子来标识这个方格究竟会有多亮/多暗。阴影因素由光线向量与方格的法线向量之间的角度来计算。让摄像机在场景中移动时,需要寻找当前所处的三角形。然后,计算三角形上的两个向量,这两个向量尾部相接,且与三角形的两边重合。通过一个左上角在原点的单位化方位的x坐标与z坐标为参数,在这些向量上进行线性内插,从而求出高度值。Terrain类提供下面两个方法来访问和修改高度图中的元素: int Terrain:getHeightmapEntry(int row, int col) return _heightmaprow * _numVertsPerRow + col; void Terrain:setHeightmapEntry(int row, int col, int value) _heightmaprow * _numVertsPerRow + col = value; Terrain类提供了两种方法来为地形加上纹理,较简单的方法是载入并使用一个先前做好的纹理图。Terrain类中实现了下面的方法,把图片文件中的纹理数据载入到IDirect3DTexture9对象中,并使用_tex指针指向它。Terrain:draw方法在渲染地形之前将会设置_tex的值。具体参见教材P216。五、 实验报告内容:(1) 程序结果分析(2) 源程序#include d3dUtility.h#include terrain.h#include camera.h#include cube.h#include vertex.h#include pSystem.h#include #include / Globals/IDirect3DDevice9* Device = 0;const int Width = 1000;const int Height = 700;ID3DXMesh* Objects4 = 0, 0, 0, 0 ;D3DXMATRIX Worlds4;D3DMATERIAL9 Mtrls4;ID3DXMesh* Object;D3DXMATRIX World;D3DMATERIAL9 Mtrl;psys:PSystem* Sno = 0;/Camera TheCamera(Camera:AIRCRAFT);Cube* Box = 0;D3DXMATRIX World1;IDirect3DTexture9* Tex = 0;Terrain* TheTerrain = 0;Camera TheCamera(Camera:LANDOBJECT);ID3DXMesh* Text = 0;/ Framework Functionsbool Setup()/ Create the terrain.D3DXCreateTeapot(Device, &Object, 0);Box = new Cube(Device);D3DXVECTOR3 lightDirection(0.0f, 1.0f, 0.0f);TheTerrain = new Terrain(Device, coastMountain641.raw, 64, 64, 10, 0.5f);TheTerrain-genTexture(&lightDirection);HDC hdc = CreateCompatibleDC(0);HFONT hFont;HFONT hFontOld;/ seed random number generatorsrand(unsigned int)time(0);/ Create Snow System.d3d:BoundingBox boundingBox;boundingBox._min = D3DXVECTOR3(-10.0f, -10.0f, -10.0f);boundingBox._max = D3DXVECTOR3(10.0f, 10.0f, 10.0f);Sno = new psys:Snow(&boundingBox, 5000);Sno-init(Device, snowflake.dds);/ Describe the font we want.LOGFONT lf;ZeroMemory(&lf, sizeof(LOGFONT);lf.lfHeight = 25; / in logical unitslf.lfWidth = 12; / in logical unitslf.lfEscapement = 0;lf.lfOrientation = 0;lf.lfWeight = 500; / boldness, range 0(light) - 1000(bold)lf.lfItalic = false;lf.lfUnderline = false;lf.lfStrikeOut = false;lf.lfCharSet = DEFAULT_CHARSET;lf.lfOutPrecision = 0;lf.lfClipPrecision = 0;lf.lfQuality = 0;lf.lfPitchAndFamily = 0;strcpy(lf.lfFaceName, Times New Roman); / font style/ Create the font and select it with the device context.hFont = CreateFontIndirect(&lf);hFontOld = (HFONT)SelectObject(hdc, hFont);/ Create the text mesh based on the selected font in the HDC.D3DXCreateText(Device, hdc, 2014329700044-lipeng,0.001f, 0.4f, &Text, 0, 0);/ Restore the old font and free the acquired HDC.SelectObject(hdc, hFontOld);DeleteObject(hFont);DeleteDC(hdc);/ Lights.D3DXMatrixTranslation(&World, 10.0f, 4.0f, 0.0f);D3DXMatrixTranslation(&World1, 3.0f, 2.0f, 0.0f);/ Set camera.D3DXVECTOR3 pos(0.0f, 1.5f, -3.3f);D3DXVECTOR3 target(4.0f, 0.0f, 0.0f);D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);D3DXMATRIX V;D3DXMatrixLookAtLH(&V,&pos,&target,&up);Device-SetTransform(D3DTS_VIEW, &V);/ Set texture filters.Mtrl = d3d:YELLOW_MTRL;D3DXCreateTextureFromFile(Device,crate.jpg,&Tex);Device-SetRenderState(D3DRS_NORMALIZENORMALS, true);Device-SetRenderState(D3DRS_SPECULARENABLE, false);/ Set projection matrix.D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI * 0.25f, / 45 - degree(float)Width / (float)Height,1.0f,1000.0f);Device-SetTransform(D3DTS_PROJECTION, &proj);return true;void Cleanup()d3d:Delete(TheTerrain);d3d:Release(Text);d3d:Release(Object);d3d:Delete(Box);d3d:Release(Tex);d3d:Delete(Sno);d3d:DrawBasicScene(0, 1.0f);bool Display(float timeDelta)/ Update the scene:if (Device)if (:GetAsyncKeyState(VK_UP) & 0x8000f)TheCamera.walk(10.0f * timeDelta);if (:GetAsyncKeyState(VK_DOWN) & 0x8000f)TheCamera.walk(-10.0f * timeDelta);if (:GetAsyncKeyState(VK_LEFT) & 0x8000f)TheCamera.yaw(-1.0f * timeDelta);if (:GetAsyncKeyState(VK_RIGHT) & 0x8000f)TheCamera.yaw(1.0f * timeDelta);if (:GetAsyncKeyState(N) & 0x8000f)TheCamera.strafe(-100.0f * timeDelta);if (:GetAsyncKeyState(M) & 0x8000f)TheCamera.strafe(100.0f * timeDelta);if (:GetAsyncKeyState(W) & 0x8000f)TheCamera.pitch(1.0f * timeDelta);if (:GetAsyncKeyState(S) & 0x8000f)TheCamera.pitch(-1.0f * timeDelta);D3DXVECTOR3 pos;TheCamera.getPosition(&pos);float height = TheTerrain-getHeight(pos.x, pos.z);pos.y = height + 5.0f; / add height because were standing upTheCamera.setPosition(&pos);D3DXMATRIX V;TheCamera.getViewMatrix(&V);Device-SetTransform(D3DTS_VIEW, &V);Sno-update(timeDelta);D3DXMATRIX yRot, T;static float y = 0.0f;D3DXMatrixRotationY(&yRot, y);y += timeDelta;if (y = 6.28f)y = 0.0f;D3DXMatrixTranslation(&T, 0.0f, 4.0f, 1.0f);T = T * yRot;D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);D3DXVECTOR3 up(0.0f, 1.0f, 4.0f);Device-SetTransform(D3DTS_WORLD, &T);/ Draw the scene:Device-Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff000000, 1.0f, 0);Device-BeginScene();Device-SetMaterial(&d3d:GREEN_MTRL);Text-DrawSubset(0);D3DXMATRIX I;D3DXMatrixIdentity(&I);Device-SetMaterial(&Mtrl);Device-SetTransform(D3DTS_WORLD, &World);Object-DrawSubset(0);Device-SetMaterial(&d3d:WHITE_MTRL);/Text-DrawSubset(0);if (TheTerrain)TheTerrain-draw(&I, false);Box-draw(&World1, 0, Tex);Device-SetTexture(0, NULL);d3d:DrawBasicScene(Device, 1.0f);/ order important, render snow last.Device-SetTransform(D3DTS_WORLD, &I);Sno-render();Device-EndScene();De
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业自动化与智能电网的融合探讨
- 工业遗产在旅游业中的利用与发展前景分析
- 工业遗产改造为文化创意产业园的实践案例研究
- 工业设计的趋势与前景分析
- 工业设计创新与趋势分析
- 工作环境改善与团队效率关系研究
- 工厂操作人员必须了解的版本更新质量要求
- 工程物流项目的高效安全管理模式及实施策略探讨
- 市场分析与预测方法在市场营销中的应用
- 工程项目管理中的数据化决策与汇报
- 2025年湖北高考真题化学试题(解析版)
- 视觉设计心理学-洞察及研究
- 安徽宣城职业技术学院招聘笔试真题2024
- 2025年江苏徐州市泉山数据有限公司招聘笔试冲刺题(带答案解析)
- 重庆市大渡口区2023-2024学年四年级下学期数学期末测试卷(含答案)
- 2025年高考全国一卷写作范文4篇
- 全省一体化政务平台AI大模型应用方案
- 医院负面清单管理制度
- 11.3 一元一次不等式组 课件 2024-2025学年人教版初中数学七年级下册
- DZ/T 0220-2006泥石流灾害防治工程勘查规范
- 2025四川泸州交通物流集团有限公司及下属公司招聘12人笔试参考题库附带答案详解析
评论
0/150
提交评论