您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > DirectX三维文字及地形场景实验-
《DX三维文字及地形场景实验》实验报告一、实验目的(1)通过实验,运用DirectX三维图形编程的知识、原理和技术;(2)掌握在综合三维场景的基础上,设计一个三维文字及地形的实现方法;(3)通过使用VC++编程环境实现三维场景中的三维文字及地形的设计;二、实验内容和要求(1)在VC++编程环境下建立三维场景,场景中包括:1.茶壶模型、圆柱体模型。2.茶壶模型使用黄色材质。3.圆柱体模型使用纹理贴图材质。4.设置一个电光源灯光系统。(2)在VC++编程环境下建立一个三维文字及地形的设计。1.在三维场景中,使用地形文件建立一个三维地形。2.同时输出三维文字,文字内容包括:学生名字、学号。3.要求能够使用粒子系统实现烟火/雪花等特效。三、实验主要仪器设备和材料计算机,VC++2005语言程序设计环境和DirectX三维图形开发环境。四、实验原理D3DX库是使用ID3DXFont接口来在Direct3D应用程序中输出文字的。这个接口通过GDI(图形设备接口)来输出文字,因此用这个接口完成任务的时候会有些效率上的损失。但是,运用了GDI,ID3DXFont可以处理复杂的文字和文字格式。在DirectX中通过D3DXCreateFontIndirect方法来创建一个ID3DXFont接口:HRESULTWINAPID3DXCreateFontIndirect(LPDIRECT3DDEVICE9pDevice,//当前所使用的设备CONSTD3DXFONT_DESC*pDesc,//字体描述结构LPD3DXFONT*ppFont//返回的字体接口);当获得了一个ID3DXFont接口以后,可以方便地利用ID3DXFont接口的DrawText方法来输出文字:INTID3DXFont::DrawText(LPCSTRpString,INTCount,LPRECTpRect,DWORDFormat,D3DCOLORColor);范例代码如下:Font-DrawText(HelloWorld,//待输出字符串-1,//NULL结尾(Nullterminating)的字符串&rect,//决定文字输出到屏幕的位置DT_TOP|DT_LEFT,//在指定RECT的左上角输出0xff000000//文字颜色:黑色);用具有不同高度、不同颜色的三角形网格来创建高山和低谷,以此模拟一个真实的地形。高度图是一个储存了地形各个顶点高度数据的数据集合。可以用硬盘上的图片来为地形加上纹理,也可以用程序生成地形纹理。通过计算每个方格的阴影因子来标识这个方格究竟会有多亮/多暗。阴影因素由光线向量与方格的法线向量之间的角度来计算。让摄像机在场景中移动时,需要寻找当前所处的三角形。然后,计算三角形上的两个向量,这两个向量尾部相接,且与三角形的两边重合。通过一个左上角在原点的单位化方位的x坐标与z坐标为参数,在这些向量上进行线性内插,从而求出高度值。Terrain类提供下面两个方法来访问和修改高度图中的元素:intTerrain::getHeightmapEntry(introw,intcol){return_heightmap[row*_numVertsPerRow+col];}voidTerrain::setHeightmapEntry(introw,intcol,intvalue){_heightmap[row*_numVertsPerRow+col]=value;}Terrain类提供了两种方法来为地形加上纹理,较简单的方法是载入并使用一个先前做好的纹理图。Terrain类中实现了下面的方法,把图片文件中的纹理数据载入到IDirect3DTexture9对象中,并使用_tex指针指向它。Terrain::draw方法在渲染地形之前将会设置_tex的值。具体参见教材P216。五、实验报告内容:(1)程序结果分析(2)源程序#included3dUtility.h#includeterrain.h#includecamera.h#includecube.h#includevertex.h#includepSystem.h#includecstdlib#includectime////Globals//IDirect3DDevice9*Device=0;constintWidth=1000;constintHeight=700;ID3DXMesh*Objects[4]={0,0,0,0};D3DXMATRIXWorlds[4];D3DMATERIAL9Mtrls[4];ID3DXMesh*Object;D3DXMATRIXWorld;D3DMATERIAL9Mtrl;psys::PSystem*Sno=0;//CameraTheCamera(Camera::AIRCRAFT);Cube*Box=0;D3DXMATRIXWorld1;IDirect3DTexture9*Tex=0;Terrain*TheTerrain=0;CameraTheCamera(Camera::LANDOBJECT);ID3DXMesh*Text=0;//FrameworkFunctionsboolSetup(){//Createtheterrain.D3DXCreateTeapot(Device,&Object,0);Box=newCube(Device);D3DXVECTOR3lightDirection(0.0f,1.0f,0.0f);TheTerrain=newTerrain(Device,coastMountain641.raw,64,64,10,0.5f);TheTerrain-genTexture(&lightDirection);HDChdc=CreateCompatibleDC(0);HFONThFont;HFONThFontOld;//seedrandomnumbergeneratorsrand((unsignedint)time(0));//CreateSnowSystem.d3d::BoundingBoxboundingBox;boundingBox._min=D3DXVECTOR3(-10.0f,-10.0f,-10.0f);boundingBox._max=D3DXVECTOR3(10.0f,10.0f,10.0f);Sno=newpsys::Snow(&boundingBox,5000);Sno-init(Device,snowflake.dds);//Describethefontwewant.LOGFONTlf;ZeroMemory(&lf,sizeof(LOGFONT));lf.lfHeight=25;//inlogicalunitslf.lfWidth=12;//inlogicalunitslf.lfEscapement=0;lf.lfOrientation=0;lf.lfWeight=500;//boldness,range0(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,TimesNewRoman);//fontstyle//Createthefontandselectitwiththedevicecontext.hFont=CreateFontIndirect(&lf);hFontOld=(HFONT)SelectObject(hdc,hFont);//CreatethetextmeshbasedontheselectedfontintheHDC.D3DXCreateText(Device,hdc,2014329700044-lipeng,0.001f,0.4f,&Text,0,0);//RestoretheoldfontandfreetheacquiredHDC.SelectObject(hdc,hFontOld);DeleteObject(hFont);DeleteDC(hdc);//Lights.D3DXMatrixTranslation(&World,10.0f,4.0f,0.0f);D3DXMatrixTranslation(&World1,3.0f,2.0f,0.0f);//Setcamera.D3DXVECTOR3pos(0.0f,1.5f,-3.3f);D3DXVECTOR3target(4.0f,0.0f,0.0f);D3DXVECTOR3up(0.0f,1.0f,0.0f);D3DXMATRIXV;D3DXMatrixLookAtLH(&V,&pos,&target,&up);Device-SetTransform(D3DTS_VIEW,&V);//Settexturefilters.Mtrl=d3d::YELLOW_MTRL;D3DXCreateTextureFromFile(Device,crate.jpg,&Tex);Device-SetRenderState(D3DRS_NORMALIZENORMALS,true);Device-SetRenderState(D3DRS_SPECULARENABLE,false);//Setprojectionmatrix.D3DXMATRIXproj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.25f,//45-degree(float)Width/(float)Height,1.0f,1000.0f);Device-SetTransform(D3DTS_PROJECTION,&proj);returntrue;}voidCleanup(){d3d::DeleteTerrain*(TheTerrain);d3d::ReleaseID3DXMesh*(Text);d3d::ReleaseID3DXMesh*(Object);d3d::DeleteCube*(Box);d3d::ReleaseIDirect3DTexture9*(Tex);d3d::Deletepsys::PSystem*(Sno);d3d::DrawBasicScene(0,1.0f);}boolDisplay(floattimeDelta){//Updatethescene: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
本文标题:DirectX三维文字及地形场景实验-
链接地址:https://www.777doc.com/doc-3542236 .html