版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、5.13 三維數(shù)字地形漫游 一、概述三維數(shù)字地形系統(tǒng)是地理信息系統(tǒng)的重要組成部分,現(xiàn)在應用于許多領域。可以從模擬飛行游戲、Google數(shù)字地球中體驗到三維數(shù)字地形生動、形象以及具有良好互動性等特點。三維數(shù)字地形已成為具有很強應用價值的技術,但是單純利用Direct3D或OpenGL來實現(xiàn)三維地形需要大量專業(yè)知識,同時編程量很大;如果使用專業(yè)三維地形引擎則價格昂貴,這些限制了廣大愛好者對三維數(shù)字地形的開發(fā)研究。不過,隨著開源運動的廣泛開展,目前有許多開源三維圖形游戲引擎(如Ogre,KlayGE,Nebula,Irrlicht等)可用于三維數(shù)字地形系統(tǒng)的開發(fā),使三維數(shù)字地形程序變得易于
2、開發(fā)。其中由德國電腦游戲專家Nikolaus Gebhardt設計的Irrlicht三維圖形引擎,可以應用于各種.NET語言中,在普通電腦即可運行,易于掌握,并由活躍的開發(fā)團隊支持。比較適合進行三維數(shù)字地形漫游系統(tǒng)的開發(fā)。文中采用目前廣泛使用的C#語言,結合Irrlicht三維圖形引擎實現(xiàn)了三維數(shù)字地形的漫游。由于采用三維圖形引擎,免去了許多底層編程工作;同時,C#的特性又使該程序開發(fā)速度較快。二、引擎配置以Microsoft Visual Studio .NET 2003為例介紹開發(fā)過程。1引擎下載從Irrlicht三維圖形引擎的主頁: 的Download欄目中下載Irrlicht引擎 SD
3、K壓縮包。整個壓縮文件約為16MB,解壓后生成irrlicht-1.3.1目錄,該目錄包括Irrlicht引擎C+源代碼、引擎動態(tài)鏈接庫、使用手冊以及一些三維素材。2建立C#工程在New Project中選擇建立C#的 Console Application工程,如圖1所示,將工程命名為Terrain。3在工程中加入Irrlicht引擎鼠標右鍵點擊新建工程的References項,選擇Add References加入引擎的動態(tài)鏈接庫Irrlicht.NET.dll,該文件在irrlicht-1.3.1binWin32-VisualStudio目錄中,如圖2所示。圖1 建立C#工程圖2 添加ir
4、rlicht.NET引擎成功加入引擎后,在References項中會顯示新子項Irrlicht.NET,如圖3所示。圖3 References項中顯示Irrlicht.NET三、地形生成方法用電腦生成三維地形的方法有許多種,其中使用最廣泛的就是高度圖生成法。我們經常會看到用不同的顏色表示海拔高度的地圖。高度圖生成法采用相同原理,只不過為了便于計算機處理,海拔高度值用圖像中的亮度值表示。即圖像中每一點處的灰度值代表該坐標處的地形海拔高度,越接近黑色則海拔越低,反之越接近白色則海拔越高。要使地形具有真實感,地形圖像必須符合一些要求,主要是灰度數(shù)值的連續(xù)變化,兩像素距離越近的點灰度值越接近。地形圖像
5、較容易得到,我們可以利用圖像處理軟件Adobe Photoshop制作,利用其“Render”特效的“Clouds”項,將前景設為黑色,背景設為白色,這樣得到的圖像可以表現(xiàn)出非常真實的地形效果。也可以從網(wǎng)上直接下載相關的用灰度值表示的高度圖。本文采用irrlicht引擎中多媒體素材文件夾meida中的高度圖terrain-heightmap.bmp,如圖4所示。為了便于編程實現(xiàn),這里將路徑為irrlicht-1.3.1media的素材文件夾拷貝到與新建C#工程Terrain相同的目錄下。圖4 高度圖這張高度圖尺寸為256*256??缮?16個三維網(wǎng)格頂點,這是普通電腦系統(tǒng)一次所能繪制的最多頂
6、點數(shù)。如果要繪制更大的三維地形,則需要分批多次繪制。通過高度圖生成三維圖形后,可在Irrlicht引擎的支持下增加控制功能以及碰撞檢測用于實現(xiàn)三維數(shù)字地形漫游。四、地形漫游程序三維地形漫游程序采用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 /命名空間指定為為地
7、形漫游 class Program: IEventReceiver /高度圖及紋理載入路徑string path="././././media/" /定義地形場景節(jié)點ITerrainSceneNode terrain; static void Main(string args)public bool OnEvent(Event p_event) public void run()其中主類Program從irrlicht事件接收器類IEventReceiver繼承。該類成員函數(shù)包括程序進入點Main(),引擎事件接收器類成員函數(shù)的重載函數(shù)OnEvent(),地形載入及主循環(huán)函
8、數(shù)run()。另外在程序開始通過使用using指令指定包含文件和相應的命名空間。包括Irrlicht的視頻驅動、引擎核心、場景管理以及用戶圖形界面的命名空間,用于實現(xiàn)console風格的編程。下面,分別介紹Program類的成員函數(shù)。1程序進入點函數(shù)首先用STAThread指示應用程序的默認線程模型是單線程單元,然后用new從堆上創(chuàng)建類Program的對象,并利用成員函數(shù)run()載入地形并進入地形場景渲染循環(huán)。STAThread static void Main(string args) Program prog = new Program(); prog.run(); 2事件響應函數(shù)OnE
9、vent()是irrlicht事件接收器類成員函數(shù)的重載,用于響應用戶自定義的事件。這里使用該函數(shù)實現(xiàn)三維地形網(wǎng)格模式和紋理顯示模式的實時轉換。用戶可通過“w”鍵實現(xiàn)這一切換。實現(xiàn)的核心代碼如下: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.Se
10、tMaterialFlag(MaterialFlag.WIREFRAME,isWireframe); break; return false; 3地形載入及主循環(huán)函數(shù)該函數(shù)的作用包括圖形程序庫的選擇、設置視窗和鏡頭、載入高度圖、碰撞檢測的實現(xiàn)以及建立程序主循環(huán)。其中可供選擇的圖形程序庫包括Driect3D 9.0、Driect3D 8.0、OpenGL,涵蓋了普通PC機上使用的主流圖形驅動庫。另外如果用戶電腦上沒裝上述程序庫的話,也可選擇irrlicht軟圖形驅動,但是顯示效果會差一些。實現(xiàn)的核心代碼如下:public void run() DriverType driverType; / 詢
11、問用戶選擇什么圖形庫 StringBuilder sb = 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 = Conso
12、le.In; TextWriter tOut = Console.Out; tOut.Write(sb.ToString(); string input = tIn.ReadLine(); / 根據(jù)用戶輸入確定相應的圖形庫 switch (input) case "a": driverType = DriverType.DIRECT3D9; break; case "b": driverType = DriverType.DIRECT3D8; break; case "c": driverType = DriverType.OPENG
13、L; break; case "d": driverType = DriverType.SOFTWARE; break;default: return; 接下來設置視窗和鏡頭。設置窗口尺寸為640*480,并創(chuàng)建Irrlicht設備device用于調用引擎核心支持,實例化引擎的場景管理對象、視頻驅動對象、圖形界面接口對象,用于場景管理、圖形程序庫調用以及圖形界面的管理。設置鏡頭類型為FPS型(第一人稱),用戶可以從第一人稱視點觀察三維地形,并通過移動鼠標可控實現(xiàn)抬頭、低頭功能,通過鍵盤上的“、”進行鏡頭前、后、左、右移動。實現(xiàn)的核心代碼如下:/ 創(chuàng)建Irrlicht設備,如
14、果創(chuàng)建失敗則退出程序IrrlichtDevice device = new IrrlichtDevice( driverType, new Dimension2D(640, 480), 32, false, true, true); if (device = null) tOut.Write("Device creation failed."); return; /引擎響應當前類的事件 device.EventReceiver=this; ISceneManager smgr=device.SceneManager; IVideoDriver driver=device.V
15、ideoDriver; IGUIEnvironment env= device.GUIEnvironment; / 加入FPS鏡頭,并設置鏡頭位置 ICameraSceneNode camera = smgr.AddCameraSceneNodeFPS(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.Cu
16、rsorControl.Visible=false;下一步導入高度圖,這里利用addTerrainSceneNode()函數(shù)載入地形場景節(jié)點,用于地形場景的管理和渲染。在該函數(shù)中設置需要載入高度圖的路徑,場景管理器會自動載入高度圖并根據(jù)其創(chuàng)建三維地形。為了使地形場景看起來更大一些,設置比例尺度向量為(40, 4.4, 40)。terrain = smgr.AddTerrainSceneNode( path+"terrain-heightmap.bmp",null,-1, new Vector3D(),new Vector3D(40, 4.4f, 40), new Color
17、(255,255,255,255); 碰撞檢測的加入可防止漫游時鏡頭穿透地形表面。為了使地形漫游有碰撞的功能,加入三角形選擇器,檢測三角形面片。同時將碰撞檢測同鏡頭關聯(lián)并設置碰撞動作,這樣當有山峰擋在鏡頭前面時,鏡頭不會從山體中間穿過,而是依地形起伏運動。實現(xiàn)的核心代碼如下:/創(chuàng)建地形節(jié)點三角形選擇器ITriangleSelector selector = smgr.CreateTerrainTriangleSelector(terrain, 0); /創(chuàng)建碰撞反應動作并與鏡頭關聯(lián) ISceneNodeAnimator anim = smgr.CreateCollisionResponseAn
18、imator( selector, camera, new Vector3D(60,100,60), new Vector3D(0,0,0), new Vector3D(0,50,0),0.0005f); camera.AddAnimator(anim);最后建立程序主循環(huán)。當Irrlicht設備運行狀態(tài)device.Run為真時,繪制出場景中所有的物體,其中整型變量lastFPS用于記錄每秒鐘渲染幀數(shù)并將結果顯示在窗口標題欄上。當主循環(huán)結束后,調用GC.Collect()回收資源。int lastFPS = -1; while (device.Run() if (device.WindowA
19、ctive) device.VideoDriver.BeginScene(true, true, new Color(0, 200, 200, 200); device.SceneManager.DrawAll(); device.VideoDriver.EndScene(); int fps = device.VideoDriver.FPS; if (lastFPS != fps) device.WindowCaption = " Terrain " + device.VideoDriver.Name + " FPS:" + fps.ToString(
20、); lastFPS = fps; GC.Collect();通過上述程序,可實現(xiàn)三維地形顯示的基本功能。五、顯示結果對上述工程進行編譯并運行。程序運行后首先會彈出console界面,請用戶選擇圖形程序庫。這里使用Driect3D 9.0,如圖5所示。圖5 選擇圖形程序庫選擇完后,系統(tǒng)會自動加載高度圖并建立三維地形,結果如圖6所示。這是用網(wǎng)格線表示的地形。用戶可通過鍵盤和鼠標控制實現(xiàn)第一人稱三維場景漫游。圖 選擇圖形程序庫為了使地形效果更生動,在導入高度圖函數(shù)AddTerrainSceneNode()后加入如下代碼:/設置紋理放大比例terrain.ScaleTexture(1.0f, 20.
21、0f);terrain.SetMaterialFlag(MaterialFlag.LIGHTING, false); /多細節(jié)紋理映射terrain.SetMaterialType(MaterialType.DETAIL_MAP); terrain.SetMaterialTexture(0, driver.GetTexture(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+"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年度新三板股票轉讓市場監(jiān)管與合規(guī)管理協(xié)議3篇
- 2025年HS系列松香乳香施膠劑項目可行性分析報告
- 2025版林權流轉金融服務創(chuàng)新合作協(xié)議4篇
- 2025年度人工智能輔助診斷系統(tǒng)開發(fā)與應用合同
- 2025年中國槐米行業(yè)發(fā)展趨勢預測及投資戰(zhàn)略咨詢報告
- 2025年波形墊項目投資可行性研究分析報告
- 個性化欠款補償及資產抵押合同范例版
- 2025年度面粉加工企業(yè)節(jié)能減排技術改造合同4篇
- 2025年度冷鏈食品運輸及倉儲一體化合同范本3篇
- 二零二五版醫(yī)療設備研發(fā)保密及技術成果共享協(xié)議3篇
- 工業(yè)自動化設備維護保養(yǎng)指南
- 《向心力》參考課件4
- 2024至2030年中國膨潤土行業(yè)投資戰(zhàn)略分析及發(fā)展前景研究報告
- 【地理】地圖的選擇和應用(分層練) 2024-2025學年七年級地理上冊同步備課系列(人教版)
- (正式版)CB∕T 4552-2024 船舶行業(yè)企業(yè)安全生產文件編制和管理規(guī)定
- JBT 14588-2023 激光加工鏡頭 (正式版)
- 2024年四川省成都市樹德實驗中學物理八年級下冊期末質量檢測試題含解析
- 九型人格與領導力講義
- 廉潔應征承諾書
- 2023年四川省成都市中考物理試卷真題(含答案)
- 泵車述職報告
評論
0/150
提交評論