季 婷
(天津新華職工大學(xué),天津 300040)
虛擬現(xiàn)實系統(tǒng)和二維計算機(jī)圖像技術(shù)不同,它注重于實時圖形的生成,由于時間的限制,使得我們需要通過降低虛擬環(huán)境的幾何復(fù)雜度和圖像質(zhì)量來保證實時顯示效果。當(dāng)場景很簡單時,要實現(xiàn)實時顯示并不困難,但往往為了達(dá)到逼真的效果,場景中會加入很多復(fù)雜的形體,并且還涉及到紋理處理、光照處理等操作,這就對實時顯示提出了更高的要求。為了解決這個問題,以往的研究者都把主要目光放在了圖形硬件加速器的發(fā)展上,高性能的圖形工作站和高度并行的圖形處理硬件是實現(xiàn)圖形實時生成的一個重要途徑。但是,虛擬現(xiàn)實系統(tǒng)對場景的復(fù)雜度幾乎沒有限制要求,因而,應(yīng)用模型的復(fù)雜程度往往會超過當(dāng)前圖形工作站的實時處理能力??紤]到這一點,我們就需要從軟件的角度出發(fā),研究如何通過減少畫面的復(fù)雜度,來實現(xiàn)復(fù)雜場景的實時顯示效果。
虛擬現(xiàn)實場景構(gòu)建的關(guān)鍵,在于如何降低場景的復(fù)雜度。
根據(jù)各種物體運動的速度和加速度,來預(yù)測下一幀畫面。在繪制之前估算出該物體下一步出現(xiàn)的位置,從而減少由輸入設(shè)備所帶來的延遲。
它的思想是將一個復(fù)雜場景分成若干個子場景,各子場景之間幾乎不可見或完全不可見。例如把一個建筑按房間劃分成多個子部分,觀察者在某個房間僅能看到房內(nèi)的場景及與門口、窗相連的其他房間,這樣系統(tǒng)就有效地減少在任意時刻需要顯示的形體數(shù)目,從而有效地降低了場景復(fù)雜度。但是,這種方法僅能使用在封閉的空間內(nèi),對開放空間則難以使用。
指對同一個場景或場景中的物體,使用具有不同細(xì)節(jié)的描述方法得到一組模型,供繪制時選擇使用。實際上,當(dāng)物體投影在屏幕上所覆蓋的區(qū)域比較小時,如果仍然對非常復(fù)雜的模型進(jìn)行細(xì)節(jié)描述,不僅沒有必要,而且會影響視覺效果,還會造成大量CPU處理資源和處理時間的浪費。在繪制時,如果一個物體離視點比較遠(yuǎn),或者這個物體比較小,就可以用較粗的LOD模型繪制;反之,如果一個物體離視點比較近,或者物體比較大,就必須用較精確的LOD模型來來繪制。如圖1所示,兔模型的遠(yuǎn)景結(jié)構(gòu)可粗略構(gòu)建,離視點越近,則構(gòu)建越需精細(xì)。
圖1 兔模型層次結(jié)構(gòu)
LOD技術(shù)在不影響畫面視覺效果的前提條件下,通過逐次簡化景物的表面細(xì)節(jié)來減少場景的幾何復(fù)雜性,從而提高繪制算法的效率。該技術(shù)通常對每一原始多面體模型建立幾個不同逼近精度的幾何模型。與原模型相比,每個模型均保留了一定層次的細(xì)節(jié)。當(dāng)從近處觀察物體時,采用精細(xì)模型,而當(dāng)從遠(yuǎn)處觀察物體時則采用較為粗糙的模型。同時,在兩個相鄰層次模型之間形成光滑的視覺過渡,即幾何形狀過渡,以避免視點連續(xù)地變化時兩個不同層次的模型間產(chǎn)生明顯的跳躍。這樣,計算機(jī)在生成場景時,根據(jù)該物體所在位置與視點間的遠(yuǎn)近關(guān)系不同,分別使用不同精細(xì)程度的模型,避免了不必要的計算,既能節(jié)約時間又不會降低場景的逼真度,使計算的效率大大提高。如圖2所示,用傳統(tǒng)的LOD算法要對這棟房子建立三個LOD層次級別的模型,最右邊為級別最低的,只有大致的房型輪廓,中圖次之,擁有了一些細(xì)節(jié)描述,左邊的圖是級別最高的,各個細(xì)節(jié)也是最清楚的。
圖2 房屋LOD三層次級別模型
可以想象,這樣建立三個LOD級別的圖像還是有跳變的,若想減少視覺差,就需要建立更多的級別模型來減少它們之間的差異,然而級別模型越多,數(shù)據(jù)的記錄量就越大。
通過對LOD算法的描述可看出,為了滿足實時要求,就要對一個物體按照視距的不同建立多個LOD模型,如圖3所示。
圖3 LOD層次模型
LOD算法可以應(yīng)用在Java3D中,實現(xiàn)物體由遠(yuǎn)至近時的視覺變化效果。對于傳統(tǒng)的LOD算法,可先在Java3D中定義各級的LOD層次模型,然后通過Switch類控制多個模型的顯示條件,比如設(shè)定表示距離的數(shù)組,當(dāng)視點處于某個位置時,觀察者可看到LOD模型3,當(dāng)視點距離不斷拉近,LOD模型2、LOD模型1會相繼替代前者依次顯示出來。
LOD方法的實現(xiàn)要用到Java 3D中的DistanceLOD類,它實現(xiàn)的是基于距離的LOD策略,它對Switch對象根據(jù)該LOD節(jié)點到觀察者的距離來選取其中之一作為可見的。它需要有一個有n個元素的單調(diào)遞增的表示距離的數(shù)組,此外還需要一個含有n+1個Switch對象的列表。它根據(jù)距離數(shù)組和當(dāng)前的距離來選擇到底應(yīng)該顯示哪個模型。以三個分界點,四級LOD模型為例,傳統(tǒng)LOD算法的結(jié)構(gòu)如下:
多個LOD模型的出現(xiàn),意味著模型數(shù)據(jù)的急劇增加,如果是在大型場景構(gòu)建中,按照傳統(tǒng)LOD算法的思想,就要在場景中增加數(shù)量龐大的物體模型,以滿足視距變化和實時運算。這樣不僅使得代碼量增大,而且在網(wǎng)絡(luò)傳輸中為了傳輸這些額外的多級模型,將會占用不必要的帶寬,降低網(wǎng)絡(luò)應(yīng)用率。
實際上,四級模型中有相當(dāng)多的數(shù)據(jù)是完全冗余重復(fù)的。前面分析了傳統(tǒng)LOD算法在數(shù)據(jù)重復(fù)方面有待優(yōu)化,因此提出了通過建立共享模型的方法減少程序代碼數(shù)據(jù)量,從而實現(xiàn)LOD算法的優(yōu)化。在Java3D中,筆者利用SharedGroup共享類的特點,將其加入到LOD算法的實現(xiàn)過程中,用于定義基本共享模型。
在設(shè)計“量子點光子晶體光纖激光器”的實驗場景時,有一部分是關(guān)于激光器內(nèi)部激光發(fā)射原理的三維演示。當(dāng)這部分場景運行時,觀察者首先看到激光器的外部結(jié)構(gòu),包括激光器外殼和風(fēng)扇葉;當(dāng)操作者按住鼠標(biāo)中鍵向懷內(nèi)拖動物體時,激光器會隨著鼠標(biāo)被拉近,并且體積會隨著距離的拉近而逐漸增大,扇葉開始轉(zhuǎn)動;當(dāng)繼續(xù)拉近物體時,人的視野會產(chǎn)生穿過激光器外殼進(jìn)入其內(nèi)部的效果;最終,觀察者可以看到激光器的內(nèi)部結(jié)構(gòu),通過鍵盤和鼠標(biāo)的控制,全方位觀察光粒子的產(chǎn)生和發(fā)射的運動過程,如圖4所示。
圖4 量子點光子晶體光纖激光器
為了達(dá)到這樣的效果,設(shè)計時把整個過程分成了三個分級點,即四級LOD模型。首先、將這四個模型分類,尋找它們的共同之處,利用SharedGroup建立基礎(chǔ)共享模型;再將基礎(chǔ)模型引入到四級模型中,并分別加入各自的特征變化形體。主要代碼如下:
二、三、四級模型的建立思想與一級模型的建立相同。模型定義好后,使用Switch類將四級模型分隔在四個顯示空間,某一視距位置下,只有一個空間處于可視狀態(tài),另外三個空間均不可見。主要代碼如下:
四級模型和顯示空間定義完畢后,開始定義三個分級點,它們可以用數(shù)組表示,三個分級點將整個空間距離分割成四段,當(dāng)觀察者移動視距達(dá)到某一位置時,相對應(yīng)級別的顯示空間中的模型便處于可見狀態(tài)。
優(yōu)化后的LOD算法與傳統(tǒng)算法相比,其數(shù)據(jù)量有相當(dāng)篇幅的減少,這種縮減在LOD更細(xì)層次的多級分層時表現(xiàn)得更為突出。同時,改進(jìn)后的算法可以達(dá)到和傳統(tǒng)算法一樣的顯示效果。
[1]張杰.Java 3D交互式三維圖形編程[M].北京:人民郵電出版社,1999.
[2]??迹趲缀魏蛨D像的機(jī)艙漫游場景建模技術(shù)[J].船海工程,2006,(03).
[3]高新瑞.Java、Java 3D與計算機(jī)幾何設(shè)計[M].北京:電子工業(yè)出版社,2007.
[4]都志輝.Java3D編程實踐——網(wǎng)絡(luò)上的三維動畫[M].北京:清華大學(xué)出版社,2002.