蔣 越
(92941部隊 葫蘆島 125001)
虛擬現(xiàn)實技術(shù)也被稱為靈境技術(shù),它是指借助計算機(jī)及最新傳感器技術(shù)創(chuàng)建一個逼真的三維虛擬環(huán)境,目的是為用戶提供視覺、聽覺、觸覺等方面的感官模擬,使使用者產(chǎn)生身臨其境的感覺,并且,使用者應(yīng)能通過某種方式與虛擬現(xiàn)實系統(tǒng)進(jìn)行交互,進(jìn)而沉浸其中。這是一項綜合集成的技術(shù),涉及到計算機(jī)圖形技術(shù)、計算機(jī)仿真技術(shù)、傳感器技術(shù)、人工智能等多種科學(xué)技術(shù)的最新發(fā)展成果。其特點是具有多感知性、沉浸感、交互性和構(gòu)想性。虛擬現(xiàn)實技術(shù)可以對真實的環(huán)境進(jìn)行模擬,這一特點使其在軍事訓(xùn)練等方面的應(yīng)用廣泛[1~2]。
三維游戲中,游戲的核心代碼即為稱為游戲引擎,它主要是對游戲中的所有功能進(jìn)行控制。由引擎控制管理的游戲功能包括:碰撞控測、提供物理系統(tǒng)以及渲染物體等,還有與玩家之間的交互,以及場景圖像與聲音的正確輸出等。游戲引擎將游戲中所有的內(nèi)容與元素組織到一起,然后統(tǒng)一對其進(jìn)行指揮和控制,使其協(xié)調(diào)有序地運行。
游戲引擎是由多個子系統(tǒng)共同構(gòu)成的復(fù)雜系統(tǒng),其主要的作用在于可以使程序員將游戲的內(nèi)容與復(fù)雜的游戲圖形、音頻等處理邏輯分開。在游戲引擎的平臺框架上,程序員可以直接調(diào)用引擎提供的應(yīng)用程序編程接口來進(jìn)行游戲的開發(fā),引擎能夠處理系統(tǒng)架構(gòu)、內(nèi)存管理、圖像繪制、音頻播放等一系列較底層的功能,使程序員可以專注于游戲內(nèi)容的設(shè)計,提高開發(fā)的速度。游戲引擎包括引擎組件,這些組件可以在不同的游戲場景中被重用,在節(jié)省開發(fā)成本和工作量的同時,也可以提高運行效率。游戲引擎不僅可以用于游戲的開發(fā),還可以用于虛擬現(xiàn)實以及視景仿真等三維圖像領(lǐng)域[3]。
XNA是微軟推出的“通用軟件開發(fā)平臺”,其目標(biāo)是降低游戲的開發(fā)成本、縮短開發(fā)的周期。XNA實際上是DirectX在.NET FrameWork框架下的發(fā)展,微軟公司希望將其發(fā)展為所有游戲開發(fā)平臺的通用標(biāo)準(zhǔn)。它可以開發(fā)基于Windows操作系統(tǒng),Windows CE操作系統(tǒng)以及Xbox平臺的游戲。與傳統(tǒng)的OpenGL和Direct3D相比,XNA不僅繼承了Direct3D在顯示、聲音以及系統(tǒng)組件等多媒體技術(shù)方面的優(yōu)勢,而且XNA在流戲開發(fā)效率、內(nèi)容與代碼維護(hù)管理、平臺支持等方面更加突出[4~5]。
雖然XNA研發(fā)的目的是為游戲開發(fā)者提供一個方便快捷的平臺,但目前的三維游戲畫面處理、真實感表現(xiàn)等方面都已經(jīng)達(dá)到了虛擬實現(xiàn)的相關(guān)要求。由于游戲產(chǎn)業(yè)的迅猛發(fā)展,出現(xiàn)了很多優(yōu)秀的游戲引擎,將這些成熟的技術(shù)應(yīng)用于虛擬現(xiàn)實的研發(fā)過程,既可以降低開發(fā)費用,又可以縮短開發(fā)的時間。我國在游戲引擎方面的研究雖然起步較晚,但發(fā)展迅速,已經(jīng)出現(xiàn)了不少優(yōu)秀的游戲引擎,可以XNA技術(shù)為基礎(chǔ)的游戲引擎還不多見。國外的三維游戲引擎雖然較為成熟,但過多的依賴引進(jìn)不僅會造成使用方面的不便,也會使我國在該方面的研發(fā)停滯不前。因此,自主研發(fā)一個具有良好結(jié)構(gòu),性能較高的三維游戲引擎,并將其運用于虛擬現(xiàn)實領(lǐng)域,具有極其重要的實用價值和意義。
游戲引擎的最重要的功能是將游戲的內(nèi)容與底層對圖像、聲音、動畫的處理分離開,使游戲的開發(fā)人員可以直接調(diào)用引擎提供的應(yīng)用程序接口(API)以及其他的輔助工具來進(jìn)行游戲的開發(fā)。
對基于XNA的虛擬現(xiàn)實引擎進(jìn)行架構(gòu)設(shè)計,采用的是分層架構(gòu)的設(shè)計思想,將虛擬現(xiàn)實引擎平臺分為四個層次,在每一層中,根據(jù)不同的應(yīng)用領(lǐng)域和功能,劃分成各個功能模塊,如圖1所示。

圖1 基于XNA的虛擬現(xiàn)實引擎架構(gòu)圖
引擎的四個層次分別為基礎(chǔ)層、元素控制層、表現(xiàn)層和邏輯層,而XNA FrameWork和.NET FrameWork主要是為各層功能的實現(xiàn)提供函數(shù)庫支撐。這一三維游戲引擎提供了開發(fā)虛擬現(xiàn)實系統(tǒng)基本的功能函數(shù)與應(yīng)用,以此作為開發(fā)平臺,開發(fā)人員可以根據(jù)游戲的設(shè)計內(nèi)容,通過調(diào)用已經(jīng)封裝好的API函數(shù),完成游戲的邏輯控制、圖像渲染、動畫與音頻效果等工作。
引擎的基礎(chǔ)層由三個功能模塊組成,輸入管理模塊的主要職責(zé)是對輸入設(shè)備產(chǎn)生的事件進(jìn)行處理和響應(yīng),這些設(shè)備包括鼠標(biāo)、鍵盤、手柄、頭盔、手套等虛擬領(lǐng)域較常用的輸入設(shè)備;通信管理模塊主要是對網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行控制和管理,目前虛擬現(xiàn)實技術(shù)和設(shè)備正向著分布式與大規(guī)模的方向發(fā)展,系統(tǒng)中各結(jié)點和組成部分的通信都是以網(wǎng)絡(luò)數(shù)據(jù)為基礎(chǔ),該模塊主要是調(diào)用.NET FrameWork中有關(guān)網(wǎng)絡(luò)數(shù)據(jù)控制的相關(guān)函數(shù)實現(xiàn)對TCP/IP、P2P、UDP等協(xié)議的支持與控制;內(nèi)存管理模塊的主要功能是對虛擬現(xiàn)實系統(tǒng)的內(nèi)存空間進(jìn)行管理,包括優(yōu)化內(nèi)在分配,處理內(nèi)在泄漏等。由于虛擬現(xiàn)實系統(tǒng)需要進(jìn)行大量的圖像渲染等極耗內(nèi)存資源的操作,因此,良好的內(nèi)容管理是保證系統(tǒng)性能的關(guān)鍵點。
元素控制層主要是對虛擬現(xiàn)實系統(tǒng)的細(xì)粒度組成元素進(jìn)行管理和控制。圖像渲染模塊負(fù)責(zé)實時渲染三維虛擬世界,這是游戲引擎中的關(guān)鍵部件,其效率和性能的表現(xiàn)將直接對虛擬現(xiàn)實系統(tǒng)產(chǎn)生影響,它主要是通過調(diào)用XNA FrameWork中與圖形圖像渲染有關(guān)的函數(shù)來實現(xiàn)的;視音頻管理主要是對虛擬現(xiàn)實系統(tǒng)中所有的背景音樂、動作音效、視頻元素等進(jìn)行控制和處理,傳統(tǒng)的基于DirectX的控制方式需要編寫大量的代碼,而在本引擎中,通過調(diào)用XNA中的AudioEngine類就可以實現(xiàn)對音效的控制;物理特性庫主要是存儲物理規(guī)律數(shù)學(xué)模型,物理系統(tǒng)是虛擬現(xiàn)實引擎的重要組成部分,其作用是增強(qiáng)虛擬現(xiàn)實系統(tǒng)的真實感,通過XNA中的剛體碰撞處理和柔體碰撞處理過程,可實現(xiàn)對真實物體碰撞過程的模擬。
表現(xiàn)層主要包括動畫管理、特效管理和界面管理三個模塊,主要的功能是提供逼真的視覺效果和友好的人機(jī)界面。在虛擬現(xiàn)實中一些特定的自然場景需要由粒子系統(tǒng)來實現(xiàn),如火焰、瀑布、煙霧等,本質(zhì)上,它是將大量的細(xì)小物體聚集到一起形成一個不規(guī)則的模糊物體,從而展現(xiàn)不同的特效,在XNA中,利用通過一些基礎(chǔ)類的處理,將各個粒子的位置信息、材質(zhì)信息等存儲到三維向量數(shù)組中,再根據(jù)一定的物理規(guī)律數(shù)學(xué)模型,實現(xiàn)虛擬現(xiàn)實所需的特殊效果;動畫也是虛擬現(xiàn)實中的重要元素,主要有關(guān)節(jié)動畫、漸變動畫、骨骼蒙皮動畫等,利用XNA的材質(zhì)管理與動畫管理函數(shù),引擎實現(xiàn)了物體的基本動畫動作,供開發(fā)人員調(diào)用;界面管理與普通的Windows程序界面類似,在引擎中是通過調(diào)用.NET FrameWork的相關(guān)函數(shù)來實現(xiàn)的。
邏輯層主要是為開發(fā)人員提供人工智能、內(nèi)容邏輯控制以及輔助工具等功能服務(wù)。人工智能主要是為虛擬現(xiàn)實中的NPC(非操作人員控制角色)行為和戰(zhàn)略決策等功能提供支持,它直接影響到虛擬現(xiàn)實系統(tǒng)的智能程度;輔助工具是為開發(fā)者提供創(chuàng)建場景、材質(zhì)、動畫、特效等虛擬現(xiàn)實元素的功能,可以有效地縮短系統(tǒng)的開發(fā)時間;內(nèi)容邏輯控制主要是為虛擬現(xiàn)實系統(tǒng)提供符合設(shè)計目標(biāo)的內(nèi)容邏輯定義與實現(xiàn),它是整個引擎的核心,統(tǒng)一調(diào)度各個模塊協(xié)同工作,控制數(shù)據(jù)流路徑,調(diào)用相關(guān)模塊處理輸入輸出等。
基于XNA的虛擬現(xiàn)實引擎是在XNA FrameWork和.NET FrameWork的支撐下建立的,并且將引擎的功能劃分為多個模塊,每一個模塊的實現(xiàn)幾乎都要調(diào)用XNA和.NET框架中的函數(shù)。在引擎的建立過程中,圖像渲染、粒子特效等的設(shè)計與實現(xiàn)是引擎成功開發(fā)的關(guān)鍵技術(shù)。
對于開發(fā)人員而言,最好是通過簡單的函數(shù)調(diào)用來實現(xiàn)圖像渲染的功能,因此在設(shè)計渲染模塊時,將模塊分為三個部分,一個部分是面向開發(fā)者提供的渲染模塊接口部分,提供了API函數(shù)供開發(fā)人員調(diào)用,主要實現(xiàn)的是著色器以及頂點管理功能;第二個部分是具體實現(xiàn)圖像渲染功能的模塊,主要是提供了材質(zhì)紋理管理功能和渲染隊列管理功能;第三個部分是網(wǎng)格模型部分,它首先從文件中讀取三維虛擬物體的模型,然后利用前兩個部分對其進(jìn)行渲染。
著色器指的是一組供計算機(jī)圖形資源在執(zhí)行渲染任務(wù)時使用的指令。它包括頂點級和像素級兩種控制粒度。由于著色器是可編程的,所以開發(fā)人員可利用著色器實現(xiàn)不同的圖像效果,而無需考慮硬件設(shè)備的限制問題,從而得到高質(zhì)量的畫面展現(xiàn)。從原理上看,著色器是利用硬件圖形處理器,也就是GPU來實現(xiàn)對圖像的渲染處理。從DirectX9.0開始,微軟公司引入了類C語言來對著色器進(jìn)行編程控制,稱為 HLSL(High Level Shading language)。XNA同樣使用HLSL來繪制所有的三維物體,其繪制的過程包括以下幾個步驟:先把著色器文件(Shader文件)導(dǎo)入到項目的“Contents”目錄中,然后創(chuàng)建一個Effect類的實例并初始化,再啟動著色器對象并設(shè)置參數(shù),最后繪制場景。
頂點與索引的管理是虛擬現(xiàn)實系統(tǒng)的基本管理單元,因為在虛擬的三維世界中,所有的物體都是由點、線、多邊形構(gòu)成的,而線和多邊形都是由點來確定的,因此對系統(tǒng)中“點”的管理是所有矢量圖像管理的基本操作。XNA框架中對圖像頂點的支持包括:
1)VertexPositionColor結(jié)構(gòu),可以定義一個包含頂點坐標(biāo)和渲染顏色的頂點。
2)VertexPositionTexture結(jié)構(gòu),可以定義一個包含頂點坐標(biāo)和紋理坐標(biāo)的頂點。
3)VertexPositionColorTexture結(jié)構(gòu),可以定義一個包含頂點坐標(biāo)、渲染顏色和紋理坐標(biāo)的頂點。
4)VertexPositionNormalTexture結(jié)構(gòu),可以定義一個包含頂點坐標(biāo)和法向量數(shù)據(jù)以及紋理坐標(biāo)的頂點。
在完成了對頂點的定義后,最快的繪制方式是使用頂點緩存器將頂點的數(shù)據(jù)存儲到事先定義的緩存內(nèi),再根據(jù)需求向用戶界面繪制三維圖形。這種處理方式的優(yōu)點在于可以在緩沖區(qū)內(nèi)對頂點進(jìn)行多次渲染,而無需重新傳輸頂點數(shù)據(jù)。但在復(fù)雜圖形的情況下,僅使用頂點緩存器將會占用較大的存儲空間,因此在實際的開發(fā)中引入了索引緩存器實現(xiàn)時間效率與空間效率的平衡。
材質(zhì)與紋理管理是對三維虛擬物體表面視覺效果的處理。材質(zhì)指的是物體表面對光照的反射程度,在具體的程序?qū)崿F(xiàn)中,它是一個包含了顏色、質(zhì)地等信息的結(jié)構(gòu)體。而紋理其實是一個位圖,在建立三維虛擬物體的過程中被貼到物體的表面。材質(zhì)與紋理的讀取需要占用較大的內(nèi)存空間和運算資源,因此,為了避免相同材質(zhì)的重復(fù)讀取,在引擎的開發(fā)過程中建立了材質(zhì)與紋理的管理庫,并將一些常用的材質(zhì)與紋理常駐內(nèi)存,有效地提高了虛擬現(xiàn)實系統(tǒng)的性能。
渲染隊列決定了材質(zhì)渲染的次序,在一個虛擬現(xiàn)實的場景內(nèi)一般會有幾個三維物體等待被渲染,如果不加控制,渲染的過程將耗費大量的時間和空間,使幀刷新頻率大幅下降。引擎設(shè)計中的渲染次序策略采用的是按材質(zhì)與紋理分類的渲染排序方式,盡可能地減少材質(zhì)與紋理的讀寫次數(shù),提高渲染的效率。
網(wǎng)格模型,也就是Mesh模型,是虛擬現(xiàn)實中三維物體的模型,具體表現(xiàn)為人物、建筑、植物等。網(wǎng)格模型一般是由包含渲染信息的點、線、面集合構(gòu)成的,一般是由設(shè)計人員完成設(shè)計后保存到文件,再由開發(fā)人員通過編程讀取文件加載到虛擬現(xiàn)實系統(tǒng)中。目前有很多工具支持對虛擬三維物體的創(chuàng)建,如3DMax,Maya等,由這些軟件創(chuàng)建完成的三維物體模型可通過腳本化操作而直接被XNA讀取。XNA直接對.x和.fbx兩種模型文件格式提供支持,并通過Model類和ModelMesh類對其進(jìn)行控制和處理。在虛擬物體加載完成后,引擎將綜合使用另外兩個部分的相關(guān)功能對其進(jìn)行渲染和處理。
粒子特效系統(tǒng)的設(shè)計目的是為了模擬不規(guī)則的模糊物體,如霧、煙等。粒子特效系統(tǒng)利用簡單的,有一定生命的細(xì)小粒子為構(gòu)成自然界不規(guī)則的景物。每一個粒子都具有一定的屬性,包括大小、著色、形狀、速度、運動方向等。不同的應(yīng)用領(lǐng)域,其粒子的屬性也不同,但一般都會經(jīng)過產(chǎn)生、活動、消亡這三個階段,從而展示出自然界物體的動態(tài)變化。
在基于XNA的虛擬現(xiàn)實引擎的粒子特效系統(tǒng)中建立了三個類,分別是粒子類、粒子生命期類和粒子調(diào)整類,其中,粒子類中記錄了自身的屬性,如大小、著色、位置、速度等,該類提供了讀取與設(shè)置這些屬性值的方法。粒子類的對象只關(guān)心自身的狀態(tài),而不需要關(guān)注其他粒子對象的狀態(tài),所有粒子對象的狀態(tài)由粒子生命期類和粒子調(diào)整類進(jìn)行管理。粒子生命期類的功能是對每一個粒子的生命周期進(jìn)行管理,負(fù)責(zé)粒子的創(chuàng)建并設(shè)置粒子的屬性,當(dāng)粒子的狀態(tài)為消亡時,負(fù)責(zé)對粒子對象的析構(gòu)。粒子調(diào)整類提供的函數(shù)是對粒子的運行活動狀態(tài)進(jìn)行控制,如爆炸情景的粒子特效應(yīng)是以爆炸點為中心向四周發(fā)散;煙霧粒子特效應(yīng)是彌漫型的,且隨著風(fēng)的方向運動。
對于粒子特效的繪制,XNA提供了兩種渲染的方式,Point Sprite和Sprite Batch。Point Sprite方式對基本的點圖元功能進(jìn)行了擴(kuò)展,支持點對象的貼圖操作,并支持紋理的直接設(shè)置。除此之外,還能夠?qū)c對象的大小、顏色、透明度等進(jìn)行設(shè)置,與粒子特效系統(tǒng)相配合,可以實現(xiàn)火焰、爆炸、雨等多種特殊的效果。Sprite Batch的處理方式是基于XNA的SpriteBatch類來實現(xiàn)的,SpriteBatch類支持一組相同設(shè)置精靈對象的繪制。
基于課題研究的三維引擎,我們開發(fā)了多個虛擬現(xiàn)實系統(tǒng),這里僅以爆炸特效為例,闡述系統(tǒng)功能的具體實現(xiàn)過程。
爆炸特效在多種場合得到應(yīng)用,特別是在軍事虛擬現(xiàn)實方面應(yīng)用得更為廣泛。這一特效的實現(xiàn)主要是依靠引擎中的粒子特效模塊來實現(xiàn)的。首先創(chuàng)建一個爆炸類ParticleExplosion,該類主要完成對爆炸效果中所有粒子的移動、更新以及描繪,該類繼承了三維引擎中的粒子調(diào)整類,并改寫了基類中的方法,使之能夠更好地展現(xiàn)爆炸的粒子效果。
以下為ParticleExplosion類中實現(xiàn)粒子更新操作的代碼:


爆炸的粒子特效如圖2所示。

圖2 爆炸粒子特效圖
基于XNA的虛擬現(xiàn)實三維引擎還可用于工業(yè)生產(chǎn)的仿真領(lǐng)域中,以該引擎為基礎(chǔ),設(shè)計開發(fā)了基于 Web的電子元器件生產(chǎn)模擬系統(tǒng),利用Silverlight技術(shù),與XNA技術(shù)相結(jié)合,基于網(wǎng)頁實現(xiàn)對生產(chǎn)過程的三維模擬。Silverlight技術(shù)提供了對GPU的支持,使基于XNA的三維引擎運行更為順暢。
首先要開啟系統(tǒng)對于GPU加速的支持。由于三維模型的渲染等操作將需要大量的計算機(jī)時間,如果使用CPU進(jìn)行處理,則會導(dǎo)致系統(tǒng)性能的急劇下降,而利用GPU的并行處理能力,可以加速三維模型的處理過程。對于GPU加速支持的開啟方法是在Silverlight應(yīng)用程序的宿主網(wǎng)頁文件配置中加入代碼〈param name="EnableGPUAcceleration"value="true"/〉。在Silverlight應(yīng)用程序的主界面位置添加DrawSerface控件。這一控件相當(dāng)于XNA三維模型繪制的畫板,用于承載與顯示三維模型。該控件有一個Draw事件,在該事件的處理方法中加入對三維模型的繪制與控制代碼,在后臺文件的控制代碼中,引用三維模擬引擎對象,通過對對象方法的調(diào)用,實現(xiàn)各個模型的加載繪制,具體代碼如下:
在后臺代碼中,還需要定義三維模型的繪制方法函數(shù),該函數(shù)接受兩個參數(shù),分別是三維模型的視圖矩陣和投影矩陣,具體函數(shù)的代碼如下:

系統(tǒng)實現(xiàn)的效果如圖3所示。

圖3 基于XNA三維引擎的工業(yè)生產(chǎn)過程模擬界面
虛擬現(xiàn)實技術(shù)的應(yīng)用越來越廣泛,其技術(shù)的成熟度也越來越高。而隨著計算機(jī)硬件的升級以及圖形圖像處理技術(shù)的完善,游戲引擎在各個方面都已經(jīng)與先進(jìn)的虛擬現(xiàn)實引擎接近。利用三維的游戲引擎來實現(xiàn)虛擬現(xiàn)實系統(tǒng),可以在系統(tǒng)效果、運行速度以及開發(fā)成本這三個方面達(dá)到平衡。基于微軟最新的游戲開發(fā)平臺XNA實現(xiàn)的虛擬現(xiàn)實三維引擎,采用分層架構(gòu)和模塊化的設(shè)計開發(fā)思想,事實證明取得了較好的效果。
[1]張占龍,羅辭勇,何為.虛擬現(xiàn)實技術(shù)概述[J].計算機(jī)仿真,2005,22(3):1-3,7.
[2]蘇建明,張續(xù)紅,胡慶夕.展望虛擬現(xiàn)實技術(shù)[J].計算機(jī)仿真,2004,21(1):18-21.
[3]江峰.3D游戲引擎研究與實現(xiàn)[D].杭州:浙江大學(xué)碩士論文,2005:5-10.
[4]Microsoft Corporation.XNA FrameWork Class Library[EB/OL].http://msdn.microsoft.com/en-us/library/bb203940(v=XNAGameStudio.31).aspx,2010-03-10.
[5]David H.Eberly.3DGame Engine Design:A Practical Approach to Real-Time Computer Graphics[M].Second Edition.San Fransisco:Morgan Kaufmann,2006:341-358.