directx三维文字及地形场景实验-

上传人:第*** 文档编号:32684644 上传时间:2018-02-12 格式:DOC 页数:10 大小:360KB
返回 下载 相关 举报
directx三维文字及地形场景实验-_第1页
第1页 / 共10页
directx三维文字及地形场景实验-_第2页
第2页 / 共10页
directx三维文字及地形场景实验-_第3页
第3页 / 共10页
directx三维文字及地形场景实验-_第4页
第4页 / 共10页
directx三维文字及地形场景实验-_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《directx三维文字及地形场景实验-》由会员分享,可在线阅读,更多相关《directx三维文字及地形场景实验-(10页珍藏版)》请在金锄头文库上搜索。

1、DX 三维文字及地形场景实验实验报告一、 实验目的(1) 通过实验,运用 DirectX 三维图形编程的知识、原理和技术;(2) 掌握在综合三维场景的基础上,设计一个三维文字及地形的实现方法;(3) 通过使用 VC+编程环境实现三维场景中的三维文字及地形的设计;二、 实验内容和要求(1)在 VC+编程环境下建立三维场景,场景中包括:1. 茶壶模型、圆柱体模型。2. 茶壶模型使用黄色材质。3. 圆柱体模型使用纹理贴图材质。4. 设置一个电光源灯光系统。(2)在 VC+编程环境下建立一个三维文字及地形的设计。1. 在三维场景中,使用地形文件建立一个三维地形。2. 同时输出三维文字,文字内容包括:学

2、生名字、学号。3. 要求能够使用粒子系统实现烟火/雪花等特效。三、 实验主要仪器设备和材料计算机,VC2005 语言程序设计环境 和 DirectX 三维图形开发环境。四、 实验原理D3DX 库是使用 ID3DXFont 接口来在 Direct3D 应用程序中输出文字的。这个接口通过 GDI(图形设备接口)来输出文字,因此用这个接口完成任务的时候会有些效率上的损失。但是,运用了 GDI,ID3DXFont 可以处理复杂的文字和文字格式。在 DirectX 中通过 D3DXCreateFontIndirect 方法来创建一个 ID3DXFont 接口:HRESULT WINAPI D3DXCre

3、ateFontIndirect( LPDIRECT3DDEVICE9 pDevice, / 当前所使用的设备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 Wor

4、ld, / 待输出字符串-1, / NULL 结尾(Null terminating)的字符串&rect, / 决定文字输出到屏幕的位置DT_TOP | DT_LEFT, / 在指定 RECT 的左上角输出0xff000000 / 文字颜色:黑色); 用具有不同高度、不同颜色的三角形网格来创建高山和低谷,以此模拟一个真实的地形。高度图是一个储存了地形各个顶点高度数据的数据集合。可以用硬盘上的图片来为地形加上纹理,也可以用程序生成地形纹理。通过计算每个方格的阴影因子来标识这个方格究竟会有多亮/多暗。阴影因素由光线向量与方格的法线向量之间的角度来计算。让摄像机在场景中移动时,需要寻找当前所处的三角

5、形。然后,计算三角形上的两个向量,这两个向量尾部相接,且与三角形的两边重合。通过一个左上角在原点的单位化方位的 x 坐标与 z 坐标为参数,在这些向量上进行线性内插,从而求出高度值。Terrain 类提供下面两个方法来访问和修改高度图中的元素:int Terrain:getHeightmapEntry(int row, int col)return _heightmaprow * _numVertsPerRow + col;void Terrain:setHeightmapEntry(int row, int col, int value)_heightmaprow * _numVertsPe

6、rRow + 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#in

7、clude 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)

8、;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, Box = new Cube(Device);D3DXVECTOR3 lightDirection(0.0f, 1.0f, 0.0f);TheTerrain =

9、new Terrain(Device, coastMountain641.raw, 64, 64, 10, 0.5f);TheTerrain-genTexture(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

10、);boundingBox._max = D3DXVECTOR3(10.0f, 10.0f, 10.0f);Sno = new psys:Snow(Sno-init(Device, snowflake.dds);/ Describe the font we want.LOGFONT lf;ZeroMemory(lf.lfHeight = 25; / in logical unitslf.lfWidth = 12; / in logical unitslf.lfEscapement = 0;lf.lfOrientation = 0;lf.lfWeight = 500; / boldness, r

11、ange 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 th

12、e device context.hFont = CreateFontIndirect(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, / Restore the old font and free the acquired HDC.SelectObject(hdc, hFontOld);DeleteObject

13、(hFont);DeleteDC(hdc);/ Lights.D3DXMatrixTranslation(D3DXMatrixTranslation(/ 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,Device-SetTransform(D3DTS_VIEW, / Set texture filters.Mtrl

14、= d3d:YELLOW_MTRL;D3DXCreateTextureFromFile(Device,crate.jpg,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

15、,1000.0f);Device-SetTransform(D3DTS_PROJECTION, 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)Th

16、eCamera.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 (:Get

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号