李宏宏,康鳳舉
(1.西北工業(yè)大學航海學院,陜西西安710072;2.水下信息處理與控制國家重點實驗室,陜西西安710072)
OpenFlight模型是 Multigen-Paradigm公司(簡稱MPI)推出的用于描述三維虛擬場景的數據模型,廣泛應用于各種視景仿真系統中,并成為視景仿真領域事實上的行業(yè)標準。隨著三維視景仿真系統規(guī)模的增大,三維實體建模工作耗費時間越來越長,占據了系統開發(fā)的大量時間,延長了視景仿真系統開發(fā)周期[1],因此就三維建模存在的建模耗時長,擴展難等問題,對可組合的建模技術提出了更高的需求。可組合建模即對多個模型中共同的部分進行建模,后期根據需求以裝配的方式組裝成所需的模型即可。目前對OpenFlight模型可組合性研究比較少,就OpenFlight模型建模存在的問題,王嬌艷等使用OpenFlight AP I函數擴展了Creator,實現了模型細調、重組等功能,縮短了建模時間,但是在模型控制方面沒進一步研究[2]。姚林海等利用配置表描述模型的組裝擴展信息,在模型加載過程中實現了模型重組,雖然根據配置表實現了模型的按部件控制,但是在仿真前期對模型的修改非常不直觀[3]。李榮江等利用分塊技術實現了模型的分塊建立[4],在后期仿真過程中,模型的部件可以根據視點的遠近動態(tài)加載,加快了模型的加載速度和顯示幀頻。
本文首先對OpenFlight模型數據格式進行研究,利用OpenFlight API函數通過對模型數據的讀取、修改、組合和寫入等方式實現了多個OpenFlight模型的組合,并提供了友好的人機界面實現模型的可視化組合,完善了模型可組合建模工具,大大縮短了建模時間,加快了視景仿真系統的開發(fā)周期。
Creator是軟件源碼不可獲取的商品化的虛擬現實建模工具,但是Multigen-Paradigm公司提供了OpenFlight API對Creator的功能進行擴展和對OpenFlight模型進行讀取操作,因此可以利用OpenFlight API讀取三維模型的數據對模型數據進行調整組合操作,然后再根據用戶需求寫成一個三維模型數據文件,即可實現三維模型的組件化建模技術[5]。OpenFlight API是一個基于C語言的二次開發(fā)函數庫,它提供了訪問OpenFlight數據庫和Creator模型系統的接口方法。通過API可以進行OpenFlight模型的轉換、實時的模擬仿真、自動建模以及通過插件的形式對Creator進行功能擴展。OpenFlight API函數庫的功能函數主要分成讀取、寫入、擴展和工具四個不同操作功能模塊,對于構建OpenFlight模型來說,使用其中的讀取和寫入兩個模塊的OpenFlight API函數即可。
OpenFlight三維模型建模方式主要可以擴展為兩種:一種是通過Creator建模工具直接進行三位實體建模來得到OpenFlight模型,另一種是通過creator建模工具建立各組件,然后利用該模型組合工具來得到OpenFlight模型[6]。總括這兩種建模方式,OpenFlight三維模型建模流程如下所示。
(1)首先對所建模型的三維實體進行分析,將其拆分為幾個不同的組件,劃分的目的是使各模型更容易通過組合實現模型的構建,模型組合也可以使用已有的模型組件。
(2)對于單個實體的建模,一般不需要拆分,直接利用Creator建模即可。對于拆分好的組件,一一建模即可。
(3)利用該軟件組合模型,完成多個模型的初步建模工作。
(4)在進行導出模型前,需要對紋理圖片,LOD和面片等進行校正、拼接等處理,這樣可以減少優(yōu)化模型。然后導出生成模型即可。
(5)完成整個三維對象模型的構建工作。
OpenFlight格式及OpenFlight API是Multigen開發(fā)的,在視覺仿真領域最為流行的標準文件格式。OpenFlight采用幾何層次結構和節(jié)點(數據庫頭節(jié)點、組、物體、面等)屬性來描述三維物體,數據節(jié)點種類很多,其常用的數據節(jié)點類型如表1所示。各類型的節(jié)點具有不同的屬性信息,其中一些屬性使用屬性調色板索引號來描述,如顏色、材質、紋理等。在OpenFlight模型中,數據節(jié)點大致包括:根節(jié)點、組節(jié)點、體節(jié)點、面節(jié)點和點節(jié)點等五大類,這些節(jié)點按照樹狀結構組織起來。一個OpenFlight數據庫的層次結構被作為一個文件存儲在磁盤上。模型以0,1二進制代碼存儲,8位為一字節(jié),字節(jié)的存儲順序是按照正序方式存儲的。所有的模型文件都是以4個字節(jié)開始記錄。前兩個字節(jié)代表記錄類型,后兩個字節(jié)代表文件長度。其中在相鄰節(jié)點上,子節(jié)點隸屬于父節(jié)點無論是在空間位置還是功能上,而兄弟節(jié)點之間則存在著一定的相關性。OpenFlight的這種樹狀多層結構允許用戶直接對樹根節(jié)點和下屬各節(jié)點進行操作,保證了從大型模型數據庫每個頂點的精確控制[7]。

表1 OpenFlight主要數據節(jié)點的說明Tab.1 Main data node of OpenFlight
利用OpenFlight API對OpenFlight文件進行基本讀寫的流程主要包括程序初始化,創(chuàng)建頭節(jié)點,新建組節(jié)點以及其他節(jié)點等,然后繪制幾何節(jié)點,并建立節(jié)點間的層級關系,最后寫入并關閉數據庫,程序退出等若干步驟。具體流程如下:
(1)程序主參數進行初始化;
(2)新建頭節(jié)點,建立數據庫集;
(3) 創(chuàng)建節(jié)點(光照,聲音,DOF,LOD,…),并給記錄集屬性賦值;
(4)通過若干三維坐標創(chuàng)建頂點集;
(5)創(chuàng)建若干子面 addVertex,組成面集makePoly;
(6)創(chuàng)建若干體節(jié)點fltObject,組成組節(jié)點fltGroup;
(7)寫入數據文件形成模型文件mgWriteDb(db)。
3.2.1 組件的添加
添加組件主要指將組件庫中的組件模型添加到其他模型中,形成一個新的模型供仿真使用。其中組件以該子節(jié)點的形式在所裝備的主模型中顯示,為了使導出模型與紋理的路徑不相關,在此都使用絕對路徑。組件添加采用將組件以外部擴展節(jié)點的調用方式加到主模型中。利用外部擴展節(jié)點,可以更加快速、方便地組合模型。這樣做也便于后期將完整模型拆分成相對獨立的組件模型,對于拆下來的組件模型還可以應用到組件模型庫的構建中,從而提高了模型的利用率。
添加組件節(jié)點的具體實現代碼步驟如下:
得到當前的數據庫頭節(jié)點mgGetCu rrentDb();
新建一個Group節(jié)點mgNewRec();
創(chuàng)建一個外部節(jié)點mgNewRec();
選擇的組件文件mgListGetSe lectedItemString();
將選擇的文件設置為外部節(jié)點mgSetA ttL ist();
將外部節(jié)點作為新建Group節(jié)點子節(jié)點mgA ttach();
寫入數據庫頭節(jié)點mgW riteDb()。
添加組件模型后,在Creator中的結構如圖1所示。

圖1 模型結構Fig.1 Model structure
3.2.2 組件的刪除
組件的刪除主要是指將外部添加進來的外部節(jié)點刪除,由于外部組件都是添加了一個節(jié)點,所以從模型中刪除一個組件模型可以通過刪除其父節(jié)點而實現,代碼如下:
g=mgGetRecByName(db,selectFullFltName);//選擇節(jié)點
mgDelete(g);//刪除節(jié)點
3.2.3 組件的移動
模型的移動首先需要定義兩個點,一個點是模型初始位置,另一個點是模型中心要移動的差值點,然后將這兩點賦給fltXmTranslate格式記錄集,模型經過記錄集的變換即可實現模型的移動。具體代碼如下:
mgrec* c=gNewRec(fltXmTranslate);//定義記錄集
mgSetCoord3d(c,fltXmTranslateFrom,a1,a2,a3);//設置模型初始位置點
mgSetCoord3d(c,fltXmTranslateDelta,b1,b2,b3);//設置模型移動差值量
mgAttach(g,c);//將組件進行移動
3.2.4 組件的旋轉與縮放
模型的旋轉與縮放在此提供繞xyz軸旋轉和縮放,通過選擇中心點、旋轉軸和旋轉角度或縮放系數即可實現模型的旋轉與縮放,具體代碼實現如下:
mgrec*x=mgNewRec(fltXmRo tate);
mgSetCoord3d( x,fltXmRotateCenter,a1,a2,a3);//選擇中心點
mgSetVector(x,fltXmRotateAx is,0,0,1);//選擇以z軸為旋轉縮放軸
m gSetA ttList(x,fltXmSca leZ,z,MG_NULL)//以z軸縮放z倍
mgSetAttList(x,fltXmRotateAngle,50,MG _NULL);//設置旋轉角度為50°
mgAttach(g,x);//旋轉與縮放模型
圖2為模型平移縮放后在Creator中的結構圖。

圖2 模型結構圖Fig.2 Model structure
按照以上的框架設計和操作模型的基本功能,基于 MFC 單文檔框架、vegaprime 2.2和OpenFlight API編程實現了模型可組合建模工具,其界面如圖3所示。該工具具有良好的人機交互編輯模型功能,以所見即所得的形式提供模型元件的平移、旋轉、縮放等幾何變換操作和拆分、組合等編輯操作以實現模型的可組合構建。

圖3 可組合建模工具運行界面Fig.3 Interface of the modeling tools
在此利用該工具將一架飛機和若干導彈進行了組合建模(圖4,圖5)。

圖4 分離的導彈和飛機Fig.4 Missiles and aircraft

圖5 組合過程和組合模型Fig.5 Process and portfolio model
本文通過調用OpenFlight API接口語言,實現了通過組裝模型組件建立完整模型的功能,并且模型組件可以被任意刪除、移動、旋轉、縮放等,解決了模型可組合建模的問題。這樣可以充分利用已有的模型資源,減少虛擬模型的建模工作量。但是本文對模型的紋理編輯,LOD節(jié)點、DOF節(jié)點等特殊節(jié)點編輯功能還未實現,有待進一步解決。
[1] 李榮江,趙剛,陳雷.基于Creator的分塊技術研究與實現[J].四川理工學院學報:自然科學版,2010,23(2):216-218.LI Rongjiang,ZHAO Gang,CHEN Lei.Research and implemention of block technology based on creator[J].Journal of Sichuan University of Science&Engineering:Natural Science Edition,2010,23(2):216-218.
[2] 張建.Creator三維模型數據庫優(yōu)化技術[J].系統仿真技術,2010,6(12):164-168.ZHANG Jian.Optimization technique of creator three dimensional model database[J].System Simulation Technology,2010,6(12):164-168.
[3] 孔中武,石林鎖,王濤.基于 Creator和VegaPrime的導彈飛行視景仿真系統設計與實現[J].四川兵工學報,2014,35(10):111-114.KONG Zhongwu,SHI Linsuo,WANG Tao.Design and implementation of missile flight scene simulation based on creator and vega prime[J].Journal of Sichuan Ordnance,2014,35(10):111-114.
[4] 丁偉利,王露.基于OpenFlight模型的通用橋梁紅外輻射特性模擬方法[J].光電工程,2013,40(10):54-62.DING Weili,WANG Lu.Infrared radiation characteristics of general bridge based on OpenFlight model[J].Opto-Electronic Engineering,2013,40(10):54-62.
[5] 常彥博,李智.虛擬三維地形模型的建模技術研究[J].桂林航天工業(yè)學院學報,2014,73(1):12-15.CHANG Yanbo,LI Zhi.Study on the modeling technology of virtual 3D terrain model[J].Journal of GuiLin University of Aerospace Technology,2014,73(1):12-15.
[6] 羅丹,蔣自成,王躍峰.OpenFlight模型的OpenGL接口研究[J].計算機仿真,2005(1):402-404.LUO Dan,JIANG Zicheng,WANG Yuefeng.Research of interface of OpenFlight model into OpenGL based systems[J].Computer Simulation,2005(1):402-404.
[7] 劉立嘉,劉裕.OpenFlight模型編輯器的設計與實現[J].石家莊鐵道學院學報:自然科學版,2009,22(2):54-58.LIU Lijia,LIU Yu.Design and realization of OpenFlight model editor[J].Journal of Shijiazhuang Railway Institute:Natural Science,2009,22(2):54-58.