摘要:虛擬現(xiàn)實技術是計算機圖形學研究和應用的熱點,尤其是隨著近年來計算機硬件的飛速發(fā)展,以及人們對虛擬現(xiàn)實的要求與日劇增,虛擬技術得到了飛速發(fā)展,應用背景也越來越廣闊。介紹了基于Ogre與CEGUI三維校園實時漫游交互系統(tǒng)的設計與實現(xiàn)流程,涵蓋了:模型的制作;Ogre3D專用素材的導出,各素材的介紹及之間的引用關系;利用得到的素材文件組織場景,其中深入介紹了Ogre3D采用的八叉樹場景管理器工作機理;如何添加實時交互;如何利用CEGUI制作系統(tǒng)界面等。
關鍵詞: 三維建模;Ogre;八叉樹;交互;CEGUI
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2013)15-3527-05
傳統(tǒng)的三維建模軟件可以輕松地完成模型場景的制作,但是卻缺乏良好的實時交互性[1]。該文介紹了如何利用3DMax建立的模型,結合高級圖形渲染引擎Oger3D,制作三維虛擬校園漫游系統(tǒng)。在三維建模一節(jié)中講述了兩種常用的建模方法及其適用環(huán)境;場景組織與渲染一節(jié)中同樣講述了兩種常用的組織方法,渲染則著重介紹了八叉樹場景管理器的工作機理;實時交互一節(jié)提供了基本的代碼框架;最后系統(tǒng)界面的制作中講述了CEGUI的使用手技巧與流程。
1 三維建模
1.1 頂點列表建模
創(chuàng)建模型最常用的方式有兩種,第一種是在代碼編寫頂點索引列表,列表中的每個頂點是一個struct類型,其中包括的數(shù)據(jù)成員至少必須有頂點位置(三個浮點數(shù)),除了位置信息外,還可以選擇性的包含:顏色成員(DWORD類型,共32位,分成4等分,分別代表透明度a,紅色r,綠色g,藍色b)、貼圖坐標位置(這是一種映射模式,當前位置的頂點對應貼圖上一對二維坐標,二維坐標的值并沒有采用實際像素值,而是將范圍限制在0~1.0之間,主要是為了適應各種尺寸不一的貼圖。如果想要效果更加逼真的話,這一項就應該添加到頂點結構中)、法向量成員(同樣是三個浮點數(shù),當場景中使用了光照效果時,這一項就必不可少了)等 。由此得出以下兩種常用的頂點結構:
至少有三個頂點數(shù)據(jù)后,就可以夠成最基本的三角形圖元,三角形圖元是構成所有模型的最小的單元,兩個共面直角三角形(共面、直角這都取決于頂點結構中的位置成員)適當擺放就可以構成一個矩形,再利用頂點結構中的紋理坐標映射一張墻面照片,該矩形看起來就會像一堵墻,至此最簡單的模型就產(chǎn)生了。在很多情況下,可以利用第一種方法來創(chuàng)建簡單的模型,在本項目中采用兩個正交的矩形,再貼上草樹的照片就構成了在各個水平方向看上去都像是棵立方體的草樹。
1.2三維工具建模
對于創(chuàng)建簡單模型,第一種方法確實便捷,但是,一旦創(chuàng)建稍微復雜點的模型,就會顯得力不從心,因此引出第二種更常用的建模方法——使用傳統(tǒng)的三維建模工具,比如,3Dmax、Maya。建模工具制作的模型最初往往是灰白的外觀,這是因為沒有為其設置貼圖路徑。
1.3模型的導出與Ogre資源文件介紹
就像.x是d3d的模型數(shù)據(jù)文件,.mesh是ogre[2,3]唯一支持的模型數(shù)據(jù)。本項目采用的是ogremax (這是一種安插在3dmax上的插件)。安裝成功后,3dmax菜單欄會多出一項“ogermax”,用3dmax打開.max文件后,分別選擇objectseting和sceneseting進行模型和場景設置(場景由一個或多個模型組成)。在所有導出的文件中可以分為四類,分別是模型數(shù)據(jù)文件(.mesh)、場景文件(.scene)、貼圖文件(.jpg,.png,.tga,.dds等)、材質(zhì)文件(.material)。設置完成后,點擊“ogermax”中的exportscene即可導出需要的素材。
其中場景文件(.scene)可以用記事本打開,是用xml語言編寫的。文件為每個模型(.mesh)創(chuàng)建了結點,并保存了各個結點的位置、縮放、旋轉(zhuǎn)以及光照等信息。
模型文件(.mesh)記錄了構成模型的所有頂點信息。
材質(zhì)文件(.material)描述了模型的外觀,它包含零個或多個貼圖文件,零個或多個著色器文件,零個或多個合成器文件。模型的逼真與否,該文件起著決定性的作用。
貼圖文件:Ogre支持各種圖片格式,如:jpg、 bmp、 png、 dds、 tga等。
著色器文件(shader):由CG、HSLS、GLSL、ASM語言編寫的代碼文件。從DirectX9.0開始,全面支持可編程流水線,相比之前的DirectX的固定功能流水流,它提供了更多的靈活性和適應性。著色器主要包含了頂點著色器、像素著色器、幾何著色器三鐘。
2 場景渲染
有了基本的素材后,就可以創(chuàng)建相應的場景。
2.1場景組織方法
配置完Ogre[4]引擎的開發(fā)環(huán)境,以及資源路徑后(debug模式下的話,需要修改resource_d.cfg配置文件,release的話,修改resource.cfg),再添加如下代碼,創(chuàng)建一個只有一個模型的場景。
運行結果如圖1所示。
這里對代碼簡單加以解釋。通過mSceneMgr→createEntity("MyEntity","綜合樓.mesh");這句代碼告訴Ogre引擎,需要一個"綜合樓.mesh"模型的實例。mSceneMgr是一個指向Ogre3D的一個叫SceneManager類的指針,這個指針由ExampleApplication類創(chuàng)建。為了創(chuàng)建一個實體,Ogre需要知道要使用哪個.mesh文件。在createEntity函數(shù)中為ent指定了名字"MyEntity",如果沒有指定的話,Ogre會自動創(chuàng)建一個。
調(diào)用mSceneMgr→getRootSceneNode() 函數(shù)將會返回場景的根結點。場景結點(包括根結點)是場景管理器的一個成員變量。mSceneMgr→getRootSceneNode()→attachObject(ent)再把之前創(chuàng)建的實體綁定到場景根結點上。同樣,也可以將其綁定到一個派生類結點上。簡而言之,子結點需要和根結點保持結點與結點之間的聯(lián)系,否則的話,子結點上的模型就得不到渲染。就像變量名所暗示的那樣,場景根結點是場景的根。因此整個場景將會以某種方式綁定到場景的根結點上。Ogre 3D使用了所謂的場景繪圖的方式來組織場景。如圖2所示。
圖2 Orge場景組織方式
如果構建整個三維校園的話,必須知道每棟建筑的準確坐標信息,如果擁有保存了整個校園場景的.max話,可以用3dmax打開.max文件,選擇工具條中的移動功具,再點擊鍵盤上的F12,就會彈出坐標對話框。把所有模型都添加進來,就可以構成整個校園場景。
2.2 八叉樹的介紹
使用八叉樹[5]場景管理器的原因:在固定功能流水線中,硬件會對不在視錐體內(nèi)的物體進行裁剪,而這種裁剪是對模型的每個頂點進行逐個判斷,要剔除一個模型往往要進行成千上萬次判斷,可見這是一種極其低效的方法。如果給定模型恰好位于八叉樹的結點當中,如果該結點的外接體不在視錐體內(nèi),那么只需要一下判斷就能將整個模型直接剔除出去,與硬件裁剪相比,明顯高效很多。
八叉樹是一種描述三維空間的樹狀數(shù)據(jù)結構,與二叉樹不同的是,八叉樹多達8個子結點。在實際的應用中,可以將八叉樹的根比作一個立方體,這個立方體封閉了整個場景,將立方體橫豎相切得到8個子立方體,分別對應著根的八個子結點,再橫豎相切子立方體,又會生出8個子結點。
一般來說,當滿足以下條件時,八叉樹應當停止劃分:
結點內(nèi)的對象已經(jīng)足夠少了,進一步劃分沒有意義。
設定一個結點的最小尺寸,當結點小于這個尺寸時,不再劃分。
達到了樹的限制深度。
將這些小方體作為八叉樹的葉子結點。在實際的渲染中,始終遵守一個原則:若攝像機的視錐體與立子體部分相交,則繼續(xù)深度遍歷該立方體的子立方體;若立方體完全不在視錐體內(nèi),則說明該立方體內(nèi)(包括子立方體)的所有對象都不在視錐內(nèi),不應當渲染;若立方體完全處在視錐體內(nèi),則無需再深度遍歷,因為該立方體內(nèi)的所有對象一定會得到渲染。剛開始時,視錐體始終與大立方體相交,因此第一次深度遍歷總是必要的,最后一直到遍歷葉子結點為止。通過這種方法,可以剔除大部分場景。
3 交互的實現(xiàn)
在Ogre中要想實現(xiàn)交互需要定義一個監(jiān)聽類,并且該類必須首先公有繼承Ogre::FrameListener,如果不想自己再動手創(chuàng)建鼠標鍵盤等輸入設備可以繼承ExampleFrameListener(在該類中已完成了該操作),其次要想添加鍵盤鼠標控制應當再繼承MouseListener和KeyListener。鍵盤鼠標的輸入分為有緩沖輸入和無緩沖輸入。對于無緩沖輸入,因為程序的刷新頻率是非??斓?,一秒幾十幀,而用戶一秒鐘的時間內(nèi),通常情況下最多只能完成一次按鍵操作,因此就會導致,幾十幀的來響應一次按鍵操作,這將導致很多意料之外的結果,為了避免這個問題,必須采用時間差的做法(這其實相當于起到了一個緩沖作用)。而對于有緩沖操作則不會出現(xiàn)這種情況,為了打開輸入緩沖,應當在監(jiān)聽類的構造函數(shù)中將傳給基類構造函數(shù)的后兩個參數(shù),設為true,來停用基類的無緩沖輸入:“:ExampleFrameListener(win, cam, true, true)” 。除此之外,還應當告訴Ogre系統(tǒng)此監(jiān)聽類中使用了有緩沖輸入,可以在構造函數(shù)中添加下面兩行代碼:
4 界面的制作
在UI上本文使用了CEGUI,這是一個免費開源的GUI庫,采用C++編寫,完全面向?qū)ο笤O計。CEGUI自身不支持渲染操作,必須DirectX3D或OpenGL的支持,除此之外,更高級的圖形庫Ogre也完美支持CEGUI。
4.1 UI素材的制作的要點
CEGUI官方推出了兩個UI編輯工具,分別是CEImagesetEditor和CELayoutEditor。兩個工具制作的產(chǎn)物分別是圖像集文件(.imageset)文件和界面布局文件(.layout是我們的最終產(chǎn)物)。CEGUI常用的文件除這兩者外常用的還有:字體文件(.ttf)、方案文件(.scheme)、主題文件(.looknfeel)。
4.2 Ogre中CEGUI的基本使用流程
首先必須編譯CEGUI源代碼(初次編譯可能會遇到各種問題,一般問題是都因為缺少.h、.lib、.dll)。編譯成功后,第一件事就是在Ogre應用程序中初始化CEGUI(注意要在Ogre的bin目錄下添加資源位置):
mRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
//設置默認資源組
最后再完成quit處理函數(shù)的邏輯編寫。采用本文方法實現(xiàn)的基于個人PC的校園三維漫游系統(tǒng)運行界面如下圖所示:
5 結束語
基于Ogre與CEGUI實現(xiàn)了在普通個人PC機上即可運行的三維虛擬校園漫游交互系統(tǒng)。實現(xiàn)的關鍵技術包括把3dmax的模型文件轉(zhuǎn)換為高級圖形渲染引擎Orge3D支持的模型數(shù)據(jù)文件,按場景文件、模型文件、材質(zhì)文件、貼圖文件、著色器文件組織數(shù)據(jù);Ogre3D專用素材的導出,利用八叉樹場景管理器管理素材文件的場景數(shù)據(jù),確保裁剪算法的高效性;利用CEGUI完成系統(tǒng)界面制作。該系統(tǒng)不僅可以在普通個人PC機上高效運行,而且可以為用戶提供良好的沉浸感和交互性,使用戶可以自主的全方位的觀察場景,方便查看用戶所關注的各種信息。
參考文獻:
[1] DLuna F. DirectX 9.0 3D 游戲開發(fā)編程基礎[M].北京:清華大學出版社,2007.
[2] Ogre Wiki.Tutorials [EB/OL].[2013-03-29].http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Tutorials.
[3] Felix Kerger. OGRE 3D 1.7 Beginner's Guide[EB/OL].[2013-03-29].http://download.csdn.net/detail/cai3322656/4220140.
[4] Gregory Junker. Pro OGRE 3D Programming[EB/OL].[2013-03-29]. http://wenku.baidu.com/view/e8d3a26d1eb91a37f1115c97.html.
[5] Dunn F, Parberry I. 3D數(shù)學基礎:圖形與游戲開發(fā)[M].北京:清華大學出版社,2005.