王 柯
(成都信息工程學(xué)院軟件工程學(xué)院,四川成都610225)
隨著計(jì)算機(jī)圖形學(xué)的發(fā)展,虛擬現(xiàn)實(shí)技術(shù)得到了廣泛的應(yīng)用[1]。虛擬現(xiàn)實(shí)技術(shù)是一種可以創(chuàng)建和體驗(yàn)虛擬世界的計(jì)算機(jī)系統(tǒng)[2],被廣泛應(yīng)用于軍事、醫(yī)療、航空、汽車、機(jī)械等多個(gè)領(lǐng)域。它是計(jì)算機(jī)圖形學(xué)、多媒體技術(shù)、人工智能技術(shù)等高科技技術(shù)的高度集成和融合,其本質(zhì)是客觀事物在計(jì)算機(jī)上的一種仿真實(shí)現(xiàn)[3]。
目前,三維虛擬場(chǎng)景的創(chuàng)建和顯示有3類比較流行開發(fā)方式,一類是在商用可視化開發(fā)平臺(tái)(如3dsmax、maya等)下進(jìn)行虛擬模型的可視化建立與編輯,再通過(guò)安置靜態(tài)或動(dòng)態(tài)攝像機(jī)實(shí)現(xiàn)對(duì)三維場(chǎng)景的觀察。這種場(chǎng)景建立方式雖然非常方便,模型的外觀和參數(shù)都可通過(guò)直觀的方式修改和調(diào)整,但在最終的虛擬場(chǎng)景中用戶往往只能按照預(yù)先設(shè)置的攝像機(jī)視點(diǎn)觀察場(chǎng)景,被動(dòng)地接受場(chǎng)景的變換和更替。難以實(shí)現(xiàn)與虛擬場(chǎng)景內(nèi)模型對(duì)象的實(shí)時(shí)交互,更無(wú)法達(dá)到通過(guò)交互改變虛擬場(chǎng)景的目標(biāo)。而大多數(shù)交互實(shí)時(shí)性虛擬現(xiàn)實(shí)系統(tǒng)多采用在開發(fā)平臺(tái)中以編程語(yǔ)言調(diào)用圖形應(yīng)用程序接口的方式實(shí)現(xiàn)特定的虛擬場(chǎng)景,其開發(fā)成果物對(duì)于實(shí)時(shí)和交互能提供良好的支持。但如果用戶對(duì)于虛擬場(chǎng)景的顯示要求有所變化,程序員往往需要對(duì)源代碼進(jìn)行修改以滿足用戶的特定要求,其編碼工作的重復(fù)率較高,復(fù)用率極低。雖然目前也陸續(xù)有一些支持編程的可視化三維軟件平臺(tái),可以以直觀的方式創(chuàng)建簡(jiǎn)單的三維場(chǎng)景,但其開發(fā)的結(jié)果大多需要依賴原始的開發(fā)平臺(tái)做支持,制約了其開發(fā)成果的通用性。因此,針對(duì)虛擬現(xiàn)實(shí)場(chǎng)景的建立工作,開發(fā)一套既能滿足可視化直觀的可復(fù)用三維模型建立方式,又保證虛擬場(chǎng)景的交互實(shí)時(shí)性的通用二次開發(fā)平臺(tái)就顯得非常重要。
為滿足虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)兩類典型用戶的使用需求,即一方面能為專業(yè)三維程序員提供直觀便捷的可復(fù)用三維場(chǎng)景建立環(huán)境,另一方面又能降低三維系統(tǒng)設(shè)計(jì)的難度,為普通工程人員提供開發(fā)交互實(shí)時(shí)三維場(chǎng)景系統(tǒng)的可能性,在設(shè)計(jì)二次開發(fā)平臺(tái)的過(guò)程中需要從方便易用、技術(shù)先進(jìn)、執(zhí)行高效、高穩(wěn)定、可移植兼容、高效伸縮和系統(tǒng)融合以及相對(duì)獨(dú)立等多個(gè)方面來(lái)衡量平臺(tái)的品質(zhì)[4]。其中平臺(tái)的易用性是設(shè)計(jì)時(shí)所考慮的首要因素,二次開發(fā)平臺(tái)的使用方式盡量符合開發(fā)人員的工程習(xí)慣,界面設(shè)計(jì)直觀易于用戶理解;另一方面,隨著三維圖形設(shè)計(jì)技術(shù)的發(fā)展,推出新的模型實(shí)現(xiàn)算法或?qū)υ械睦L制方法進(jìn)行改進(jìn)以后,對(duì)用戶之前所開發(fā)的應(yīng)用程序應(yīng)該保持較好的向下兼容性,因此系統(tǒng)使用組件式開發(fā)將是解決兼容與移植的可行方案;由于虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)涉及最多的是三維圖形的處理和渲染,有效提升平臺(tái)處理和渲染的速度是平臺(tái)設(shè)計(jì)人員和普通用戶都非常關(guān)注的問(wèn)題,因此在設(shè)計(jì)過(guò)程中應(yīng)用先進(jìn)的算法和軟件技術(shù)提高系統(tǒng)的執(zhí)行速度也顯得非常重要。
在二次平臺(tái)的開發(fā)過(guò)程中,根據(jù)二次開發(fā)技術(shù)的不同可分為兩種模式:內(nèi)嵌機(jī)制和外部開發(fā)機(jī)制[4]。虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)采用了外部開發(fā)機(jī)制進(jìn)行開發(fā),外部開發(fā)機(jī)式具有非常強(qiáng)大的功能,幾乎可以實(shí)現(xiàn)宿主程序提供的所有功能,并具有較強(qiáng)的獨(dú)立性,還可生成新的應(yīng)用程序,擁有自己的界面和功能,它的執(zhí)行不影響宿主程序的運(yùn)行。另外,外部開發(fā)機(jī)制還可以將開發(fā)成果作為插件形式在宿主程序中調(diào)用,增加宿主程序的功能模塊,這一開發(fā)模式就相當(dāng)于一次軟件創(chuàng)新,但是亦有其不足,它要求二次開發(fā)人員具有較高的素質(zhì),對(duì)宿主程序有相當(dāng)?shù)亓私?且對(duì)宿主程序的要求較高[4]。虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)的開發(fā)模式示意圖如圖1所示。
在設(shè)計(jì)過(guò)程中,將虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)劃分為5大功能模塊,分別是:基本三維模型處理模塊、擴(kuò)充三維模型處理模塊、三維場(chǎng)景管理模塊、界面管理模塊、代碼處理模塊。為保證二次平臺(tái)的可移植性與兼容性,所有模塊都以組件的形式加以實(shí)現(xiàn)。
虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)的模塊劃分如圖2所示。
(1)基本三維模型處理模塊負(fù)責(zé)處理二次開發(fā)平臺(tái)中簡(jiǎn)單三維模型的建立和修改工作,簡(jiǎn)單三維模型主要支持經(jīng)典幾何圖元類別,具體包括點(diǎn)、線、多邊形、長(zhǎng)方體、球體、圓柱、圓錐、圓環(huán)以及茶壺等模型。
(2)擴(kuò)充三維模型處理模塊負(fù)責(zé)處理二次開發(fā)平臺(tái)中多種復(fù)雜三維模型的建立與修改工作,目前已經(jīng)實(shí)現(xiàn)的擴(kuò)充三維模型包括能從外部導(dǎo)入的3ds模型、簡(jiǎn)單粒子系統(tǒng)、起伏地形以及動(dòng)態(tài)火焰模型,后續(xù)將對(duì)該類模型進(jìn)行擴(kuò)充,以實(shí)現(xiàn)更多非規(guī)則模型的繪制。
(3)三維場(chǎng)景管理模塊負(fù)責(zé)處理三維場(chǎng)景中光照變換、材質(zhì)設(shè)定、虛擬攝像機(jī)控制的管理和參數(shù)變換。
(4)界面管理模塊用于控制虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)的界面布局、負(fù)責(zé)捕捉和傳遞控件事件。
(5)代碼處理模塊是虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)的關(guān)鍵部分,負(fù)責(zé)處理控件事件,向后臺(tái)源代碼區(qū)插入用戶通過(guò)可視化界面操作的結(jié)果,并負(fù)責(zé)將可視化編輯的結(jié)果保存為文件。
圖1 虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)的開發(fā)模式示意圖
圖2 虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)的模塊劃分
虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)采用VC++.net和OpenGL進(jìn)行開發(fā)。C++是一種基于標(biāo)準(zhǔn)的互操作語(yǔ)言,開發(fā)人員通過(guò)VC++.net,可以享用到最優(yōu)秀的C++開發(fā)工具,VC++.net也為開發(fā)人員提供了大量的專業(yè)級(jí)功能,方便為Windows環(huán)境創(chuàng)建性能優(yōu)越的應(yīng)用程序和組件;開放圖形庫(kù)OpenGL是SGI公司所發(fā)布的一套三維的計(jì)算機(jī)圖形和模型庫(kù),它集成了諸如坐標(biāo)變換、光照設(shè)置、材質(zhì)和紋理編輯、像素操作、融合、反走樣和霧化等復(fù)雜三維圖形操作命令,以其優(yōu)良的性能成為了三維圖形軟件接口的工業(yè)標(biāo)準(zhǔn),被廣泛應(yīng)用于虛擬現(xiàn)實(shí)和計(jì)算機(jī)可視化仿真領(lǐng)域[5,6]。
(1)基本三維模型處理
現(xiàn)實(shí)世界中存在很多三維物體可以由基本三維圖元組裝而成,基于上述考慮,在基本三維模型處理模塊中將圖元的共性加以提煉,定義為父類3DPModel,而由父類所派生的模型組件,封裝為子類。
在具體定義時(shí),父類中僅抽象出最基本的成員變量,分別是模型名稱ModelName、模型頂點(diǎn)列表Model-PointList、模型紋理坐標(biāo)ModelTexCoor、模型位置變換參數(shù)集ModelPositionSet以及模型顏色控制參數(shù)ModelColor;在成員函數(shù)部分,則僅定義出最基本的模型繪制函數(shù)ModelDraw()、模型顏色設(shè)置函數(shù)ModelColorSet()、模型頂點(diǎn)設(shè)置函數(shù)ModelPointsSet()、模型紋理坐標(biāo)設(shè)置函數(shù)ModelTexCoorSet()以及模型變換函數(shù)ModelMove()、ModelRotate和ModelScale(),為功能上處理方便,初期并沒(méi)有將材質(zhì)的定義放入模型類中,而是放入三維場(chǎng)景管理模塊中做單獨(dú)處理。
各圖元子類從父類繼承,以多態(tài)性實(shí)現(xiàn)自己的功能,較為簡(jiǎn)單的圖元對(duì)象,諸如點(diǎn)、線、多邊形和長(zhǎng)方體模型,在其繪制函數(shù)中預(yù)先已寫入幾何圖元的定義值,而稍復(fù)雜的圖元對(duì)象,諸如球體、圓柱、圓錐、圓環(huán)以及茶壺等模型,為減少編程的難度,則采用直接調(diào)用輔助庫(kù)函數(shù)進(jìn)行繪制。
(2)3ds模型的處理
在模擬真實(shí)世界的三維場(chǎng)景中,除了部分可以由基本圖元組裝而成的模型外,還有更多外形各異、組成復(fù)雜的模型外觀,比較典型的如汽車、樓房和綠化帶等,這類模型如果直接使用基本圖元建模函數(shù)組合生成,建模的工作量極大,且難于獲得最理想的模擬效果,因此系統(tǒng)中的這類復(fù)雜模型便利用目前比較成熟的三維設(shè)計(jì)類軟件,采用真實(shí)對(duì)象的外觀參數(shù)進(jìn)行可視化建模,建模完成后再將三維模型的外觀控制信息讀取到系統(tǒng)中交由OpenGL進(jìn)行轉(zhuǎn)換和控制,該部分處理工作將其歸入擴(kuò)充三維模型處理模塊中進(jìn)行。
為保證平臺(tái)處理的便利性,預(yù)先建立了一些通用模型,初期共分為3類,分別是汽車類GLCar、樓房類GLBuildering和綠化類GLGreen,將事先建立好的模型轉(zhuǎn)換為3ds文件,3ds格式的文件是由很多塊所構(gòu)成,塊是3ds文件的基本單位,塊是可以互相嵌套的,通過(guò)文件中大量的塊以及塊的相互嵌套構(gòu)成了一個(gè)復(fù)雜但又靈活的文件系統(tǒng)[7],在代碼中通過(guò)分析3ds文件的結(jié)構(gòu)獲取繪制關(guān)注的頂點(diǎn)信息、面索引信息和紋理坐標(biāo)信息等。除了可以直接使用系統(tǒng)所預(yù)先建立好的3類模型外,在實(shí)現(xiàn)過(guò)程中也考慮到模型的多樣性與用戶的特殊需求,實(shí)現(xiàn)時(shí)將讀取3ds文件的代碼進(jìn)行了封裝,以便用戶可以在平臺(tái)內(nèi)導(dǎo)入自己所建立的外部模型以構(gòu)成虛擬場(chǎng)景。
(3)代碼處理
在設(shè)計(jì)時(shí),為方便虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)進(jìn)行后續(xù)代碼的處理工作,事先創(chuàng)建完成了三維代碼的基本框架?;究蚣苤饕糜趯?shí)現(xiàn)三維繪圖前的準(zhǔn)備,主要包括引用Windows環(huán)境和OpenGL庫(kù)所對(duì)應(yīng)的各頭文件、設(shè)置像素格式、初始化OpenGL繪圖環(huán)境、定制時(shí)鐘、創(chuàng)建繪圖窗口以及定義基本窗口事件處理機(jī)制等內(nèi)容。
平臺(tái)運(yùn)行中,代碼的植入由用戶事件所驅(qū)動(dòng),在基本框架內(nèi)按照程序結(jié)構(gòu)進(jìn)行了植入?yún)^(qū)位置的預(yù)分配,設(shè)置了代碼植入?yún)^(qū)域的識(shí)別符,系統(tǒng)通過(guò)讀取識(shí)別符以確定代碼的植入位置。
為方便程序讀取,使用VC++的注釋格式,比如植入與三維環(huán)境中光照相關(guān)代碼的區(qū)域,其首行識(shí)別符為/*light*/;植入三維模型材質(zhì)相關(guān)代碼的區(qū)域,其首行識(shí)別符為/*material*/。比如當(dāng)用戶打開光源設(shè)置面板,啟用光源并設(shè)置該光源的各項(xiàng)參數(shù)后,系統(tǒng)將自動(dòng)植入該光源所對(duì)應(yīng)的源代碼,為避免用戶輸入錯(cuò)誤,在系統(tǒng)中對(duì)各輸入框的輸入值范圍進(jìn)行了限定,并規(guī)定如果用戶輸入“#”字符,則表示不啟用該項(xiàng)參數(shù)值,如圖3所示。
圖3 光照源代碼的生成
虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)在VC++.net開發(fā)環(huán)境下,通過(guò)調(diào)用OpenGL三維圖形庫(kù)進(jìn)行二次開發(fā)而成。較為完整地處理了三維繪圖環(huán)境下的相關(guān)技術(shù),包括繪制環(huán)境的預(yù)處理工作;標(biāo)準(zhǔn)三維圖元的繪制以及復(fù)雜三維模型的導(dǎo)入與生成;簡(jiǎn)單粒子系統(tǒng)、三維地形、動(dòng)態(tài)火焰等非規(guī)則模型的模擬;最為關(guān)鍵的是,通過(guò)事件驅(qū)動(dòng)的代碼置入方式,為平臺(tái)用戶提供了直觀可視化的三維應(yīng)用程序開發(fā)方式,通過(guò)在平臺(tái)內(nèi)設(shè)置三維場(chǎng)景的相關(guān)參數(shù),快速生成三維場(chǎng)景源代碼。
用戶通過(guò)點(diǎn)擊菜單欄下方建模工具欄中的各建模工具按鈕,可以快速創(chuàng)建簡(jiǎn)單幾何圖元,其創(chuàng)建效果如圖4所示;圖5為導(dǎo)入外部3ds模型后的場(chǎng)景,用戶可以方便地通過(guò)攝像機(jī)設(shè)置面板修改視點(diǎn)的位置和方向;除了以參數(shù)方式設(shè)定攝像機(jī)視點(diǎn)外,用戶也可以通過(guò)鍵盤上的方向鍵與拖動(dòng)鼠標(biāo),實(shí)現(xiàn)場(chǎng)景的漫游工作,圖6是視點(diǎn)漫游過(guò)程中觀察某室外場(chǎng)景的示意,在該場(chǎng)景中使用了系統(tǒng)的預(yù)置綠化類模型建立了一些樹木外觀。
在平臺(tái)界面左側(cè)下方的新代碼植入顯示窗口內(nèi),會(huì)實(shí)時(shí)顯示之前操作確認(rèn)后所植入的新代碼,用戶可以檢查代碼的植入情況,如有不正確之處,也可以手工修正。當(dāng)所有對(duì)三維場(chǎng)景的修改工作完成后,即可將植入代碼后的繪制程序進(jìn)行存儲(chǔ),如圖7所示。
圖4 基本圖元繪制
圖5 設(shè)置攝像機(jī)參數(shù)
圖6 視點(diǎn)漫游過(guò)程中所觀察到的室外場(chǎng)景效果
圖7 存儲(chǔ)繪制代碼
對(duì)建立一套可視化桌面虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)進(jìn)行了闡述。平臺(tái)較為完整地處理了三維圖像的繪制工作,包括經(jīng)典幾何圖元以及外部3ds模型等非規(guī)則三維景觀的建立、視點(diǎn)轉(zhuǎn)換、光照設(shè)置等功能。與目前流行的三維場(chǎng)景系統(tǒng)開發(fā)方法相比,虛擬現(xiàn)實(shí)二次開發(fā)平臺(tái)通過(guò)前臺(tái)可視化操作觸發(fā)后臺(tái)代碼植入的方式,實(shí)現(xiàn)了對(duì)三維基本框架的豐富與擴(kuò)充,為平臺(tái)用戶進(jìn)行三維視景源代碼的編寫提供了直觀便捷的操作方式,一方面減低了進(jìn)行三維可視化代碼編制的難度,另一方面則較大地提高了開發(fā)高品質(zhì)三維軟件的效率。
[1]鄧宇,陳孝威.基于Visual C#.NET與3DSTATE實(shí)現(xiàn)虛擬現(xiàn)實(shí)[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(21):4019-4021.
[2]檀鵬,張樹揚(yáng).虛擬現(xiàn)實(shí)開發(fā)平臺(tái)系統(tǒng)的研究與實(shí)現(xiàn)[J].徐州師范大學(xué)學(xué)報(bào),2005,23(2):57-59.
[3]徐延海,寧凡坤.用于汽車操縱穩(wěn)定性模擬的虛擬現(xiàn)實(shí)平臺(tái)的研究[J].系統(tǒng)仿真學(xué)報(bào),2007,19(17):3984-3987.
[4]趙衛(wèi)東,柳先輝,衛(wèi)剛.CAD軟件二次開發(fā)平臺(tái)實(shí)現(xiàn)技術(shù)[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào).2003,15(4):512-516.
[5]賀孝梅,劉丹青,姚新港.基于OpenGL的小球碰撞動(dòng)畫模擬的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2007,24(6):184-186.
[6]魏海濤,姜昱明,張婭.基于OpenGL的虛擬航天飛機(jī)發(fā)射場(chǎng)景仿真研究[J].微電子學(xué)與計(jì)算機(jī),2009,26(5):200-203,208.
[7]李勝睿,王乘恩,王智高.計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)教材[M].北京:機(jī)械工業(yè)出版社,2004:173-175.