王 柯
(成都信息工程學院軟件工程學院,四川成都610225)
隨著計算機圖形學的發展,虛擬現實技術得到了廣泛的應用[1]。虛擬現實技術是一種可以創建和體驗虛擬世界的計算機系統[2],被廣泛應用于軍事、醫療、航空、汽車、機械等多個領域。它是計算機圖形學、多媒體技術、人工智能技術等高科技技術的高度集成和融合,其本質是客觀事物在計算機上的一種仿真實現[3]。
目前,三維虛擬場景的創建和顯示有3類比較流行開發方式,一類是在商用可視化開發平臺(如3dsmax、maya等)下進行虛擬模型的可視化建立與編輯,再通過安置靜態或動態攝像機實現對三維場景的觀察。這種場景建立方式雖然非常方便,模型的外觀和參數都可通過直觀的方式修改和調整,但在最終的虛擬場景中用戶往往只能按照預先設置的攝像機視點觀察場景,被動地接受場景的變換和更替。難以實現與虛擬場景內模型對象的實時交互,更無法達到通過交互改變虛擬場景的目標。而大多數交互實時性虛擬現實系統多采用在開發平臺中以編程語言調用圖形應用程序接口的方式實現特定的虛擬場景,其開發成果物對于實時和交互能提供良好的支持。但如果用戶對于虛擬場景的顯示要求有所變化,程序員往往需要對源代碼進行修改以滿足用戶的特定要求,其編碼工作的重復率較高,復用率極低。雖然目前也陸續有一些支持編程的可視化三維軟件平臺,可以以直觀的方式創建簡單的三維場景,但其開發的結果大多需要依賴原始的開發平臺做支持,制約了其開發成果的通用性。因此,針對虛擬現實場景的建立工作,開發一套既能滿足可視化直觀的可復用三維模型建立方式,又保證虛擬場景的交互實時性的通用二次開發平臺就顯得非常重要。
為滿足虛擬現實二次開發平臺兩類典型用戶的使用需求,即一方面能為專業三維程序員提供直觀便捷的可復用三維場景建立環境,另一方面又能降低三維系統設計的難度,為普通工程人員提供開發交互實時三維場景系統的可能性,在設計二次開發平臺的過程中需要從方便易用、技術先進、執行高效、高穩定、可移植兼容、高效伸縮和系統融合以及相對獨立等多個方面來衡量平臺的品質[4]。其中平臺的易用性是設計時所考慮的首要因素,二次開發平臺的使用方式盡量符合開發人員的工程習慣,界面設計直觀易于用戶理解;另一方面,隨著三維圖形設計技術的發展,推出新的模型實現算法或對原有的繪制方法進行改進以后,對用戶之前所開發的應用程序應該保持較好的向下兼容性,因此系統使用組件式開發將是解決兼容與移植的可行方案;由于虛擬現實二次開發平臺涉及最多的是三維圖形的處理和渲染,有效提升平臺處理和渲染的速度是平臺設計人員和普通用戶都非常關注的問題,因此在設計過程中應用先進的算法和軟件技術提高系統的執行速度也顯得非常重要。
在二次平臺的開發過程中,根據二次開發技術的不同可分為兩種模式:內嵌機制和外部開發機制[4]。虛擬現實二次開發平臺采用了外部開發機制進行開發,外部開發機式具有非常強大的功能,幾乎可以實現宿主程序提供的所有功能,并具有較強的獨立性,還可生成新的應用程序,擁有自己的界面和功能,它的執行不影響宿主程序的運行。另外,外部開發機制還可以將開發成果作為插件形式在宿主程序中調用,增加宿主程序的功能模塊,這一開發模式就相當于一次軟件創新,但是亦有其不足,它要求二次開發人員具有較高的素質,對宿主程序有相當地了解,且對宿主程序的要求較高[4]。虛擬現實二次開發平臺的開發模式示意圖如圖1所示。
在設計過程中,將虛擬現實二次開發平臺劃分為5大功能模塊,分別是:基本三維模型處理模塊、擴充三維模型處理模塊、三維場景管理模塊、界面管理模塊、代碼處理模塊。為保證二次平臺的可移植性與兼容性,所有模塊都以組件的形式加以實現。
虛擬現實二次開發平臺的模塊劃分如圖2所示。
(1)基本三維模型處理模塊負責處理二次開發平臺中簡單三維模型的建立和修改工作,簡單三維模型主要支持經典幾何圖元類別,具體包括點、線、多邊形、長方體、球體、圓柱、圓錐、圓環以及茶壺等模型。
(2)擴充三維模型處理模塊負責處理二次開發平臺中多種復雜三維模型的建立與修改工作,目前已經實現的擴充三維模型包括能從外部導入的3ds模型、簡單粒子系統、起伏地形以及動態火焰模型,后續將對該類模型進行擴充,以實現更多非規則模型的繪制。
(3)三維場景管理模塊負責處理三維場景中光照變換、材質設定、虛擬攝像機控制的管理和參數變換。
(4)界面管理模塊用于控制虛擬現實二次開發平臺的界面布局、負責捕捉和傳遞控件事件。
(5)代碼處理模塊是虛擬現實二次開發平臺的關鍵部分,負責處理控件事件,向后臺源代碼區插入用戶通過可視化界面操作的結果,并負責將可視化編輯的結果保存為文件。

圖1 虛擬現實二次開發平臺的開發模式示意圖

圖2 虛擬現實二次開發平臺的模塊劃分
虛擬現實二次開發平臺采用VC++.net和OpenGL進行開發。C++是一種基于標準的互操作語言,開發人員通過VC++.net,可以享用到最優秀的C++開發工具,VC++.net也為開發人員提供了大量的專業級功能,方便為Windows環境創建性能優越的應用程序和組件;開放圖形庫OpenGL是SGI公司所發布的一套三維的計算機圖形和模型庫,它集成了諸如坐標變換、光照設置、材質和紋理編輯、像素操作、融合、反走樣和霧化等復雜三維圖形操作命令,以其優良的性能成為了三維圖形軟件接口的工業標準,被廣泛應用于虛擬現實和計算機可視化仿真領域[5,6]。
(1)基本三維模型處理
現實世界中存在很多三維物體可以由基本三維圖元組裝而成,基于上述考慮,在基本三維模型處理模塊中將圖元的共性加以提煉,定義為父類3DPModel,而由父類所派生的模型組件,封裝為子類。
在具體定義時,父類中僅抽象出最基本的成員變量,分別是模型名稱ModelName、模型頂點列表Model-PointList、模型紋理坐標ModelTexCoor、模型位置變換參數集ModelPositionSet以及模型顏色控制參數ModelColor;在成員函數部分,則僅定義出最基本的模型繪制函數ModelDraw()、模型顏色設置函數ModelColorSet()、模型頂點設置函數ModelPointsSet()、模型紋理坐標設置函數ModelTexCoorSet()以及模型變換函數ModelMove()、ModelRotate和ModelScale(),為功能上處理方便,初期并沒有將材質的定義放入模型類中,而是放入三維場景管理模塊中做單獨處理。
各圖元子類從父類繼承,以多態性實現自己的功能,較為簡單的圖元對象,諸如點、線、多邊形和長方體模型,在其繪制函數中預先已寫入幾何圖元的定義值,而稍復雜的圖元對象,諸如球體、圓柱、圓錐、圓環以及茶壺等模型,為減少編程的難度,則采用直接調用輔助庫函數進行繪制。
(2)3ds模型的處理
在模擬真實世界的三維場景中,除了部分可以由基本圖元組裝而成的模型外,還有更多外形各異、組成復雜的模型外觀,比較典型的如汽車、樓房和綠化帶等,這類模型如果直接使用基本圖元建模函數組合生成,建模的工作量極大,且難于獲得最理想的模擬效果,因此系統中的這類復雜模型便利用目前比較成熟的三維設計類軟件,采用真實對象的外觀參數進行可視化建模,建模完成后再將三維模型的外觀控制信息讀取到系統中交由OpenGL進行轉換和控制,該部分處理工作將其歸入擴充三維模型處理模塊中進行。
為保證平臺處理的便利性,預先建立了一些通用模型,初期共分為3類,分別是汽車類GLCar、樓房類GLBuildering和綠化類GLGreen,將事先建立好的模型轉換為3ds文件,3ds格式的文件是由很多塊所構成,塊是3ds文件的基本單位,塊是可以互相嵌套的,通過文件中大量的塊以及塊的相互嵌套構成了一個復雜但又靈活的文件系統[7],在代碼中通過分析3ds文件的結構獲取繪制關注的頂點信息、面索引信息和紋理坐標信息等。除了可以直接使用系統所預先建立好的3類模型外,在實現過程中也考慮到模型的多樣性與用戶的特殊需求,實現時將讀取3ds文件的代碼進行了封裝,以便用戶可以在平臺內導入自己所建立的外部模型以構成虛擬場景。
(3)代碼處理
在設計時,為方便虛擬現實二次開發平臺進行后續代碼的處理工作,事先創建完成了三維代碼的基本框架。基本框架主要用于實現三維繪圖前的準備,主要包括引用Windows環境和OpenGL庫所對應的各頭文件、設置像素格式、初始化OpenGL繪圖環境、定制時鐘、創建繪圖窗口以及定義基本窗口事件處理機制等內容。
平臺運行中,代碼的植入由用戶事件所驅動,在基本框架內按照程序結構進行了植入區位置的預分配,設置了代碼植入區域的識別符,系統通過讀取識別符以確定代碼的植入位置。
為方便程序讀取,使用VC++的注釋格式,比如植入與三維環境中光照相關代碼的區域,其首行識別符為/*light*/;植入三維模型材質相關代碼的區域,其首行識別符為/*material*/。比如當用戶打開光源設置面板,啟用光源并設置該光源的各項參數后,系統將自動植入該光源所對應的源代碼,為避免用戶輸入錯誤,在系統中對各輸入框的輸入值范圍進行了限定,并規定如果用戶輸入“#”字符,則表示不啟用該項參數值,如圖3所示。

圖3 光照源代碼的生成
虛擬現實二次開發平臺在VC++.net開發環境下,通過調用OpenGL三維圖形庫進行二次開發而成。較為完整地處理了三維繪圖環境下的相關技術,包括繪制環境的預處理工作;標準三維圖元的繪制以及復雜三維模型的導入與生成;簡單粒子系統、三維地形、動態火焰等非規則模型的模擬;最為關鍵的是,通過事件驅動的代碼置入方式,為平臺用戶提供了直觀可視化的三維應用程序開發方式,通過在平臺內設置三維場景的相關參數,快速生成三維場景源代碼。
用戶通過點擊菜單欄下方建模工具欄中的各建模工具按鈕,可以快速創建簡單幾何圖元,其創建效果如圖4所示;圖5為導入外部3ds模型后的場景,用戶可以方便地通過攝像機設置面板修改視點的位置和方向;除了以參數方式設定攝像機視點外,用戶也可以通過鍵盤上的方向鍵與拖動鼠標,實現場景的漫游工作,圖6是視點漫游過程中觀察某室外場景的示意,在該場景中使用了系統的預置綠化類模型建立了一些樹木外觀。
在平臺界面左側下方的新代碼植入顯示窗口內,會實時顯示之前操作確認后所植入的新代碼,用戶可以檢查代碼的植入情況,如有不正確之處,也可以手工修正。當所有對三維場景的修改工作完成后,即可將植入代碼后的繪制程序進行存儲,如圖7所示。

圖4 基本圖元繪制

圖5 設置攝像機參數

圖6 視點漫游過程中所觀察到的室外場景效果

圖7 存儲繪制代碼
對建立一套可視化桌面虛擬現實二次開發平臺進行了闡述。平臺較為完整地處理了三維圖像的繪制工作,包括經典幾何圖元以及外部3ds模型等非規則三維景觀的建立、視點轉換、光照設置等功能。與目前流行的三維場景系統開發方法相比,虛擬現實二次開發平臺通過前臺可視化操作觸發后臺代碼植入的方式,實現了對三維基本框架的豐富與擴充,為平臺用戶進行三維視景源代碼的編寫提供了直觀便捷的操作方式,一方面減低了進行三維可視化代碼編制的難度,另一方面則較大地提高了開發高品質三維軟件的效率。
[1]鄧宇,陳孝威.基于Visual C#.NET與3DSTATE實現虛擬現實[J].計算機工程與設計,2006,27(21):4019-4021.
[2]檀鵬,張樹揚.虛擬現實開發平臺系統的研究與實現[J].徐州師范大學學報,2005,23(2):57-59.
[3]徐延海,寧凡坤.用于汽車操縱穩定性模擬的虛擬現實平臺的研究[J].系統仿真學報,2007,19(17):3984-3987.
[4]趙衛東,柳先輝,衛剛.CAD軟件二次開發平臺實現技術[J].計算機輔助設計與圖形學學報.2003,15(4):512-516.
[5]賀孝梅,劉丹青,姚新港.基于OpenGL的小球碰撞動畫模擬的實現[J].計算機應用與軟件,2007,24(6):184-186.
[6]魏海濤,姜昱明,張婭.基于OpenGL的虛擬航天飛機發射場景仿真研究[J].微電子學與計算機,2009,26(5):200-203,208.
[7]李勝睿,王乘恩,王智高.計算機圖形學實驗教材[M].北京:機械工業出版社,2004:173-175.