版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、5.13 三維數(shù)字地形漫游 一、概述三維數(shù)字地形系統(tǒng)是地理信息系統(tǒng)的重要組成部分,現(xiàn)在應(yīng)用于許多領(lǐng)域??梢詮哪M飛行游戲、Google數(shù)字地球中體驗(yàn)到三維數(shù)字地形生動(dòng)、形象以及具有良好互動(dòng)性等特點(diǎn)。三維數(shù)字地形已成為具有很強(qiáng)應(yīng)用價(jià)值的技術(shù),但是單純利用Direct3D或OpenGL來實(shí)現(xiàn)三維地形需要大量專業(yè)知識(shí),同時(shí)編程量很大;如果使用專業(yè)三維地形引擎則價(jià)格昂貴,這些限制了廣大愛好者對(duì)三維數(shù)字地形的開發(fā)研究。不過,隨著開源運(yùn)動(dòng)的廣泛開展,目前有許多開源三維圖形游戲引擎(如Ogre,KlayGE,Nebula,Irrlicht等)可用于三維數(shù)字地形系統(tǒng)的開發(fā),使三維數(shù)字地形程序變得易于
2、開發(fā)。其中由德國(guó)電腦游戲?qū)<襈ikolaus Gebhardt設(shè)計(jì)的Irrlicht三維圖形引擎,可以應(yīng)用于各種.NET語言中,在普通電腦即可運(yùn)行,易于掌握,并由活躍的開發(fā)團(tuán)隊(duì)支持。比較適合進(jìn)行三維數(shù)字地形漫游系統(tǒng)的開發(fā)。文中采用目前廣泛使用的C#語言,結(jié)合Irrlicht三維圖形引擎實(shí)現(xiàn)了三維數(shù)字地形的漫游。由于采用三維圖形引擎,免去了許多底層編程工作;同時(shí),C#的特性又使該程序開發(fā)速度較快。二、引擎配置以Microsoft Visual Studio .NET 2003為例介紹開發(fā)過程。1引擎下載從Irrlicht三維圖形引擎的主頁: 的Download欄目中下載Irrlicht引擎 SD
3、K壓縮包。整個(gè)壓縮文件約為16MB,解壓后生成irrlicht-1.3.1目錄,該目錄包括Irrlicht引擎C+源代碼、引擎動(dòng)態(tài)鏈接庫、使用手冊(cè)以及一些三維素材。2建立C#工程在New Project中選擇建立C#的 Console Application工程,如圖1所示,將工程命名為Terrain。3在工程中加入Irrlicht引擎鼠標(biāo)右鍵點(diǎn)擊新建工程的References項(xiàng),選擇Add References加入引擎的動(dòng)態(tài)鏈接庫Irrlicht.NET.dll,該文件在irrlicht-1.3.1binWin32-VisualStudio目錄中,如圖2所示。圖1 建立C#工程圖2 添加ir
4、rlicht.NET引擎成功加入引擎后,在References項(xiàng)中會(huì)顯示新子項(xiàng)Irrlicht.NET,如圖3所示。圖3 References項(xiàng)中顯示Irrlicht.NET三、地形生成方法用電腦生成三維地形的方法有許多種,其中使用最廣泛的就是高度圖生成法。我們經(jīng)常會(huì)看到用不同的顏色表示海拔高度的地圖。高度圖生成法采用相同原理,只不過為了便于計(jì)算機(jī)處理,海拔高度值用圖像中的亮度值表示。即圖像中每一點(diǎn)處的灰度值代表該坐標(biāo)處的地形海拔高度,越接近黑色則海拔越低,反之越接近白色則海拔越高。要使地形具有真實(shí)感,地形圖像必須符合一些要求,主要是灰度數(shù)值的連續(xù)變化,兩像素距離越近的點(diǎn)灰度值越接近。地形圖像
5、較容易得到,我們可以利用圖像處理軟件Adobe Photoshop制作,利用其“Render”特效的“Clouds”項(xiàng),將前景設(shè)為黑色,背景設(shè)為白色,這樣得到的圖像可以表現(xiàn)出非常真實(shí)的地形效果。也可以從網(wǎng)上直接下載相關(guān)的用灰度值表示的高度圖。本文采用irrlicht引擎中多媒體素材文件夾meida中的高度圖terrain-heightmap.bmp,如圖4所示。為了便于編程實(shí)現(xiàn),這里將路徑為irrlicht-1.3.1media的素材文件夾拷貝到與新建C#工程Terrain相同的目錄下。圖4 高度圖這張高度圖尺寸為256*256。可生成216個(gè)三維網(wǎng)格頂點(diǎn),這是普通電腦系統(tǒng)一次所能繪制的最多頂
6、點(diǎn)數(shù)。如果要繪制更大的三維地形,則需要分批多次繪制。通過高度圖生成三維圖形后,可在Irrlicht引擎的支持下增加控制功能以及碰撞檢測(cè)用于實(shí)現(xiàn)三維數(shù)字地形漫游。四、地形漫游程序三維地形漫游程序采用console風(fēng)格,程序的整體框架如下: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/" /定義地形場(chǎng)景節(jié)點(diǎn)ITerrainSceneNode terrain; static void Main(string args)public bool OnEvent(Event p_event) public void run()其中主類Program從irrlicht事件接收器類IEventReceiver繼承。該類成員函數(shù)包括程序進(jìn)入點(diǎn)Main(),引擎事件接收器類成員函數(shù)的重載函數(shù)OnEvent(),地形載入及主循環(huán)函
8、數(shù)run()。另外在程序開始通過使用using指令指定包含文件和相應(yīng)的命名空間。包括Irrlicht的視頻驅(qū)動(dòng)、引擎核心、場(chǎng)景管理以及用戶圖形界面的命名空間,用于實(shí)現(xiàn)console風(fēng)格的編程。下面,分別介紹Program類的成員函數(shù)。1程序進(jìn)入點(diǎn)函數(shù)首先用STAThread指示應(yīng)用程序的默認(rèn)線程模型是單線程單元,然后用new從堆上創(chuàng)建類Program的對(duì)象,并利用成員函數(shù)run()載入地形并進(jìn)入地形場(chǎng)景渲染循環(huán)。STAThread static void Main(string args) Program prog = new Program(); prog.run(); 2事件響應(yīng)函數(shù)OnE
9、vent()是irrlicht事件接收器類成員函數(shù)的重載,用于響應(yīng)用戶自定義的事件。這里使用該函數(shù)實(shí)現(xiàn)三維地形網(wǎng)格模式和紋理顯示模式的實(shí)時(shí)轉(zhuǎn)換。用戶可通過“w”鍵實(shí)現(xiàn)這一切換。實(shí)現(xiàn)的核心代碼如下:public bool OnEvent(Event p_event) / 檢測(cè)用戶是否按下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ù)的作用包括圖形程序庫的選擇、設(shè)置視窗和鏡頭、載入高度圖、碰撞檢測(cè)的實(shí)現(xiàn)以及建立程序主循環(huán)。其中可供選擇的圖形程序庫包括Driect3D 9.0、Driect3D 8.0、OpenGL,涵蓋了普通PC機(jī)上使用的主流圖形驅(qū)動(dòng)庫。另外如果用戶電腦上沒裝上述程序庫的話,也可選擇irrlicht軟圖形驅(qū)動(dòng),但是顯示效果會(huì)差一些。實(shí)現(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ù)用戶輸入確定相應(yīng)的圖形庫 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; 接下來設(shè)置視窗和鏡頭。設(shè)置窗口尺寸為640*480,并創(chuàng)建Irrlicht設(shè)備device用于調(diào)用引擎核心支持,實(shí)例化引擎的場(chǎng)景管理對(duì)象、視頻驅(qū)動(dòng)對(duì)象、圖形界面接口對(duì)象,用于場(chǎng)景管理、圖形程序庫調(diào)用以及圖形界面的管理。設(shè)置鏡頭類型為FPS型(第一人稱),用戶可以從第一人稱視點(diǎn)觀察三維地形,并通過移動(dòng)鼠標(biāo)可控實(shí)現(xiàn)抬頭、低頭功能,通過鍵盤上的“、”進(jìn)行鏡頭前、后、左、右移動(dòng)。實(shí)現(xiàn)的核心代碼如下:/ 創(chuàng)建Irrlicht設(shè)備,如
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; /引擎響應(yīng)當(dāng)前類的事件 device.EventReceiver=this; ISceneManager smgr=device.SceneManager; IVideoDriver driver=device.V
15、ideoDriver; IGUIEnvironment env= device.GUIEnvironment; / 加入FPS鏡頭,并設(shè)置鏡頭位置 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; / 設(shè)置鼠標(biāo)箭頭不可見 device.Cu
16、rsorControl.Visible=false;下一步導(dǎo)入高度圖,這里利用addTerrainSceneNode()函數(shù)載入地形場(chǎng)景節(jié)點(diǎn),用于地形場(chǎng)景的管理和渲染。在該函數(shù)中設(shè)置需要載入高度圖的路徑,場(chǎng)景管理器會(huì)自動(dòng)載入高度圖并根據(jù)其創(chuàng)建三維地形。為了使地形場(chǎng)景看起來更大一些,設(shè)置比例尺度向量為(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); 碰撞檢測(cè)的加入可防止漫游時(shí)鏡頭穿透地形表面。為了使地形漫游有碰撞的功能,加入三角形選擇器,檢測(cè)三角形面片。同時(shí)將碰撞檢測(cè)同鏡頭關(guān)聯(lián)并設(shè)置碰撞動(dòng)作,這樣當(dāng)有山峰擋在鏡頭前面時(shí),鏡頭不會(huì)從山體中間穿過,而是依地形起伏運(yùn)動(dòng)。實(shí)現(xiàn)的核心代碼如下:/創(chuàng)建地形節(jié)點(diǎn)三角形選擇器ITriangleSelector selector = smgr.CreateTerrainTriangleSelector(terrain, 0); /創(chuàng)建碰撞反應(yīng)動(dòng)作并與鏡頭關(guān)聯(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)。當(dāng)Irrlicht設(shè)備運(yùn)行狀態(tài)device.Run為真時(shí),繪制出場(chǎng)景中所有的物體,其中整型變量lastFPS用于記錄每秒鐘渲染幀數(shù)并將結(jié)果顯示在窗口標(biāo)題欄上。當(dāng)主循環(huán)結(jié)束后,調(diào)用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();通過上述程序,可實(shí)現(xiàn)三維地形顯示的基本功能。五、顯示結(jié)果對(duì)上述工程進(jìn)行編譯并運(yùn)行。程序運(yùn)行后首先會(huì)彈出console界面,請(qǐng)用戶選擇圖形程序庫。這里使用Driect3D 9.0,如圖5所示。圖5 選擇圖形程序庫選擇完后,系統(tǒng)會(huì)自動(dòng)加載高度圖并建立三維地形,結(jié)果如圖6所示。這是用網(wǎng)格線表示的地形。用戶可通過鍵盤和鼠標(biāo)控制實(shí)現(xiàn)第一人稱三維場(chǎng)景漫游。圖 選擇圖形程序庫為了使地形效果更生動(dòng),在導(dǎo)入高度圖函數(shù)AddTerrainSceneNode()后加入如下代碼:/設(shè)置紋理放大比例terrain.ScaleTexture(1.0f, 20.
21、0f);terrain.SetMaterialFlag(MaterialFlag.LIGHTING, false); /多細(xì)節(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
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 師德師風(fēng)提升年活動(dòng)簡(jiǎn)報(bào)范文(6篇)
- 農(nóng)村培訓(xùn)課件
- 開學(xué)第一課觀后感(匯編15篇)
- 2024年中國(guó)折扣零售行業(yè)市場(chǎng)現(xiàn)狀、前景分析研究報(bào)告(智研咨詢發(fā)布)
- 二零二五年度海上風(fēng)電項(xiàng)目土地租賃與海上平臺(tái)建設(shè)合同3篇
- 二零二五年度林業(yè)資源綜合開發(fā)承包協(xié)議3篇
- 2025版食用菌木屑研發(fā)與生產(chǎn)合作合同3篇
- 二零二五年度旅游線路設(shè)計(jì)與開發(fā)合作協(xié)議3篇
- 2025版環(huán)境執(zhí)法檢查相關(guān)方環(huán)境管理協(xié)議3篇
- 鼓勵(lì)幼兒自主探索的教學(xué)方法計(jì)劃
- 2025-2030年中國(guó)電動(dòng)高爾夫球車市場(chǎng)運(yùn)行狀況及未來發(fā)展趨勢(shì)分析報(bào)告
- 河南省濮陽市2024-2025學(xué)年高一上學(xué)期1月期末考試語文試題(含答案)
- 2024年08月北京中信銀行北京分行社會(huì)招考(826)筆試歷年參考題庫附帶答案詳解
- 蘇教版二年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)
- 職業(yè)技術(shù)學(xué)院教學(xué)質(zhì)量監(jiān)控與評(píng)估處2025年教學(xué)質(zhì)量監(jiān)控督導(dǎo)工作計(jì)劃
- 金字塔原理與結(jié)構(gòu)化思維考核試題及答案
- 基礎(chǔ)護(hù)理學(xué)導(dǎo)尿操作
- 標(biāo)牌加工風(fēng)險(xiǎn)防范方案
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及答案解析
- 【字貼】人教PEP版-小學(xué)英語四年級(jí)上冊(cè)單詞表國(guó)標(biāo)體描紅字帖(含音標(biāo))
- 如何寫好賞析文章
評(píng)論
0/150
提交評(píng)論