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