三维数字地形漫游

上传人:沈*** 文档编号:133912563 上传时间:2022-08-11 格式:DOC 页数:9 大小:125.50KB
收藏 版权申诉 举报 下载
三维数字地形漫游_第1页
第1页 / 共9页
三维数字地形漫游_第2页
第2页 / 共9页
三维数字地形漫游_第3页
第3页 / 共9页
资源描述:

《三维数字地形漫游》由会员分享,可在线阅读,更多相关《三维数字地形漫游(9页珍藏版)》请在装配图网上搜索。

1、5.13 三维数字地形漫游一、概述三维数字地形系统是地理信息系统的重要组成部分,现在应用于许多领域。可以从模拟飞行游戏、Google数字地球中体验到三维数字地形生动、形象以及具有良好互动性等特点。三维数字地形已成为具有很强应用价值的技术,但是单纯利用Direct3D或OpenGL来实现三维地形需要大量专业知识,同时编程量很大;如果使用专业三维地形引擎则价格昂贵,这些限制了广大爱好者对三维数字地形的开发研究。不过,随着开源运动的广泛开展,目前有许多开源三维图形游戏引擎(如Ogre,KlayGE,Nebula,Irrlicht等)可用于三维数字地形系统的开发,使三维数字地形程序变得易于开发。其中由

2、德国电脑游戏专家Nikolaus Gebhardt设计的Irrlicht三维图形引擎,可以应用于各种.NET语言中,在普通电脑即可运行,易于掌握,并由活跃的开发团队支持。比较适合进行三维数字地形漫游系统的开发。文中采用目前广泛使用的C#语言,结合Irrlicht三维图形引擎实现了三维数字地形的漫游。由于采用三维图形引擎,免去了许多底层编程工作;同时,C#的特性又使该程序开发速度较快。二、引擎配置以Microsoft Visual Studio .NET 2003为例介绍开发过程。1引擎下载从Irrlicht三维图形引擎的主页: 的Download栏目中下载Irrlicht引擎 SDK压缩包。整

3、个压缩文件约为16MB,解压后生成irrlicht-1.3.1目录,该目录包括Irrlicht引擎C+源代码、引擎动态链接库、使用手册以及一些三维素材。2建立C#工程在New Project中选择建立C#的 Console Application工程,如图1所示,将工程命名为Terrain。3在工程中加入Irrlicht引擎鼠标右键点击新建工程的References项,选择Add References加入引擎的动态链接库Irrlicht.NET.dll,该文件在irrlicht-1.3.1binWin32-VisualStudio目录中,如图2所示。图1 建立C#工程图2 添加irrlicht

4、.NET引擎成功加入引擎后,在References项中会显示新子项Irrlicht.NET,如图3所示。图3 References项中显示Irrlicht.NET三、地形生成方法用电脑生成三维地形的方法有许多种,其中使用最广泛的就是高度图生成法。我们经常会看到用不同的颜色表示海拔高度的地图。高度图生成法采用相同原理,只不过为了便于计算机处理,海拔高度值用图像中的亮度值表示。即图像中每一点处的灰度值代表该坐标处的地形海拔高度,越接近黑色则海拔越低,反之越接近白色则海拔越高。要使地形具有真实感,地形图像必须符合一些要求,主要是灰度数值的连续变化,两像素距离越近的点灰度值越接近。地形图像较容易得到,

5、我们可以利用图像处理软件Adobe Photoshop制作,利用其“Render”特效的“Clouds”项,将前景设为黑色,背景设为白色,这样得到的图像可以表现出非常真实的地形效果。也可以从网上直接下载相关的用灰度值表示的高度图。本文采用irrlicht引擎中多媒体素材文件夹meida中的高度图terrain-heightmap.bmp,如图4所示。为了便于编程实现,这里将路径为irrlicht-1.3.1media的素材文件夹拷贝到与新建C#工程Terrain相同的目录下。图4 高度图这张高度图尺寸为256*256。可生成216个三维网格顶点,这是普通电脑系统一次所能绘制的最多顶点数。如果要

6、绘制更大的三维地形,则需要分批多次绘制。通过高度图生成三维图形后,可在Irrlicht引擎的支持下增加控制功能以及碰撞检测用于实现三维数字地形漫游。四、地形漫游程序三维地形漫游程序采用console风格,程序的整体框架如下:using System; using System.Text; using System.IO; using Irrlicht; using Irrlicht.Video; using Irrlicht.Core; using Irrlicht.Scene; using Irrlicht.GUI;namespace TerrainRoam /命名空间指定为为地形漫游 cl

7、ass Program: IEventReceiver /高度图及纹理载入路径string path=././././media/; /定义地形场景节点ITerrainSceneNode terrain; static void Main(string args)public bool OnEvent(Event p_event) public void run()其中主类Program从irrlicht事件接收器类IEventReceiver继承。该类成员函数包括程序进入点Main(),引擎事件接收器类成员函数的重载函数OnEvent(),地形载入及主循环函数run()。另外在程序开始通过使

8、用using指令指定包含文件和相应的命名空间。包括Irrlicht的视频驱动、引擎核心、场景管理以及用户图形界面的命名空间,用于实现console风格的编程。下面,分别介绍Program类的成员函数。1程序进入点函数首先用STAThread指示应用程序的默认线程模型是单线程单元,然后用new从堆上创建类Program的对象,并利用成员函数run()载入地形并进入地形场景渲染循环。STAThread static void Main(string args) Program prog = new Program(); prog.run(); 2事件响应函数OnEvent()是irrlicht事件

9、接收器类成员函数的重载,用于响应用户自定义的事件。这里使用该函数实现三维地形网格模式和纹理显示模式的实时转换。用户可通过“w”键实现这一切换。实现的核心代码如下:public bool OnEvent(Event p_event) / 检测用户是否按下W键 if (p_event.Type = EventType.KeyInput & !p_event.KeyPressedDown) switch(p_event.Key) case KeyCode.KEY_KEY_W: isWireframe=!isWireframe; terrain.SetMaterialFlag(MaterialFlag

10、.WIREFRAME,isWireframe); break; return false; 3地形载入及主循环函数该函数的作用包括图形程序库的选择、设置视窗和镜头、载入高度图、碰撞检测的实现以及建立程序主循环。其中可供选择的图形程序库包括Driect3D 9.0、Driect3D 8.0、OpenGL,涵盖了普通PC机上使用的主流图形驱动库。另外如果用户电脑上没装上述程序库的话,也可选择irrlicht软图形驱动,但是显示效果会差一些。实现的核心代码如下:public void run() DriverType driverType; / 询问用户选择什么图形库 StringBuilder s

11、b = new StringBuilder(); sb.Append(Please select the driver you want for this example:n); sb.Append(n(a) Direct3D 9.0cn(b) Direct3D 8.1n(c) OpenGL 1.5); sb.Append(n(d) Software Renderern (otherKey) exit nn);/ 获取用户输入 TextReader tIn = Console.In; TextWriter tOut = Console.Out; tOut.Write(sb.ToString()

12、; string input = tIn.ReadLine(); / 根据用户输入确定相应的图形库 switch (input) case a: driverType = DriverType.DIRECT3D9; break; case b: driverType = DriverType.DIRECT3D8; break; case c: driverType = DriverType.OPENGL; break; case d: driverType = DriverType.SOFTWARE; break;default: return; 接下来设置视窗和镜头。设置窗口尺寸为640*4

13、80,并创建Irrlicht设备device用于调用引擎核心支持,实例化引擎的场景管理对象、视频驱动对象、图形界面接口对象,用于场景管理、图形程序库调用以及图形界面的管理。设置镜头类型为FPS型(第一人称),用户可以从第一人称视点观察三维地形,并通过移动鼠标可控实现抬头、低头功能,通过键盘上的“、”进行镜头前、后、左、右移动。实现的核心代码如下:/ 创建Irrlicht设备,如果创建失败则退出程序IrrlichtDevice device = new IrrlichtDevice( driverType, new Dimension2D(640, 480), 32, false, true,

14、true); if (device = null) tOut.Write(Device creation failed.); return; /引擎响应当前类的事件 device.EventReceiver=this; ISceneManager smgr=device.SceneManager; IVideoDriver driver=device.VideoDriver; IGUIEnvironment env= device.GUIEnvironment; / 加入FPS镜头,并设置镜头位置 ICameraSceneNode camera = smgr.AddCameraSceneNod

15、eFPS(null,100.0f,1200.0f,-1); camera.Position=new Vector3D(1900*2,255*2,3700*2); camera.Target= new Vector3D(2397*2,343*2,2700*2); camera.FarValue=12000.0f; / 设置鼠标箭头不可见 device.CursorControl.Visible=false;下一步导入高度图,这里利用addTerrainSceneNode()函数载入地形场景节点,用于地形场景的管理和渲染。在该函数中设置需要载入高度图的路径,场景管理器会自动载入高度图并根据其创建三

16、维地形。为了使地形场景看起来更大一些,设置比例尺度向量为(40, 4.4, 40)。terrain = smgr.AddTerrainSceneNode( path+terrain-heightmap.bmp,null,-1, new Vector3D(),new Vector3D(40, 4.4f, 40), new Color(255,255,255,255); 碰撞检测的加入可防止漫游时镜头穿透地形表面。为了使地形漫游有碰撞的功能,加入三角形选择器,检测三角形面片。同时将碰撞检测同镜头关联并设置碰撞动作,这样当有山峰挡在镜头前面时,镜头不会从山体中间穿过,而是依地形起伏运动。实现的核心代

17、码如下:/创建地形节点三角形选择器ITriangleSelector selector = smgr.CreateTerrainTriangleSelector(terrain, 0); /创建碰撞反应动作并与镜头关联 ISceneNodeAnimator anim = smgr.CreateCollisionResponseAnimator( selector, camera, new Vector3D(60,100,60), new Vector3D(0,0,0), new Vector3D(0,50,0),0.0005f); camera.AddAnimator(anim);最后建立程序

18、主循环。当Irrlicht设备运行状态device.Run为真时,绘制出场景中所有的物体,其中整型变量lastFPS用于记录每秒钟渲染帧数并将结果显示在窗口标题栏上。当主循环结束后,调用GC.Collect()回收资源。int lastFPS = -1; while (device.Run() if (device.WindowActive) device.VideoDriver.BeginScene(true, true, new Color(0, 200, 200, 200); device.SceneManager.DrawAll(); device.VideoDriver.EndSce

19、ne(); int fps = device.VideoDriver.FPS; if (lastFPS != fps) device.WindowCaption = Terrain + device.VideoDriver.Name + FPS: + fps.ToString(); lastFPS = fps; GC.Collect();通过上述程序,可实现三维地形显示的基本功能。五、显示结果对上述工程进行编译并运行。程序运行后首先会弹出console界面,请用户选择图形程序库。这里使用Driect3D 9.0,如图5所示。图5 选择图形程序库选择完后,系统会自动加载高度图并建立三维地形,结果

20、如图6所示。这是用网格线表示的地形。用户可通过键盘和鼠标控制实现第一人称三维场景漫游。图 选择图形程序库为了使地形效果更生动,在导入高度图函数AddTerrainSceneNode()后加入如下代码:/设置纹理放大比例terrain.ScaleTexture(1.0f, 20.0f);terrain.SetMaterialFlag(MaterialFlag.LIGHTING, false); /多细节纹理映射terrain.SetMaterialType(MaterialType.DETAIL_MAP); terrain.SetMaterialTexture(0, driver.GetText

21、ure(path+terrain-texture.jpg); terrain.SetMaterialTexture(1, driver.GetTexture(path+detailmap3.jpg); /加入天空盒 smgr.AddSkyBoxSceneNode( driver.GetTexture(path+irrlicht2_up.jpg), driver.GetTexture(path+irrlicht2_dn.jpg), driver.GetTexture(path+irrlicht2_lf.jpg), driver.GetTexture(path+irrlicht2_rt.jpg),

22、 driver.GetTexture(path+irrlicht2_ft.jpg), driver.GetTexture(path+irrlicht2_bk.jpg),null,0); /使用mipmap效果driver.SetTextureCreationFlag(TextureCreationFlag.CREATE_MIP_MAPS, true);这里通过SetMaterialFlag()函数设置场景光照效果为全亮显示,同时利用GetTexture()函数导入低、高细节层次纹理贴图,利用引擎支持的mipmap技术根据镜头离场景远近进行动态映射。离镜头较远的场景只使用低细节层次纹理。镜头附近

23、的场景则同时使用两种纹理的混合,这样即可以生动表示地形场景,也可减少系统资源消耗,如图7所示。图7 高、低细节层次纹理为了使三维地形更生动,加入天空盒,在场景上、下、左、右、前、后都导入贴图,形成远景,具有透视感。这里的低细节层次纹理采用irrlicht素材文件夹media中的静态阴影贴图,使地形具有真实感。最终显示结果如图8所示。图7 显示结果五、结语文中提供了一种实现三维数字地形漫游的解决方案。在Irricht三维图形引擎的支持下,利用C#可较容易地实现三维数字地形的漫游。本文提供的程序框架是可以扩充的,读者可参考Irrlicht引擎使用手册,加入更多功能,从而编写出更好的三维地形漫游程序。9 / 9文档可自由编辑打印

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!