李宏宏,康鳳舉
(1.西北工業(yè)大學(xué)航海學(xué)院,陜西西安710072;2.水下信息處理與控制國(guó)家重點(diǎn)實(shí)驗(yàn)室,陜西西安710072)
OpenFlight模型是 Multigen-Paradigm公司(簡(jiǎn)稱MPI)推出的用于描述三維虛擬場(chǎng)景的數(shù)據(jù)模型,廣泛應(yīng)用于各種視景仿真系統(tǒng)中,并成為視景仿真領(lǐng)域事實(shí)上的行業(yè)標(biāo)準(zhǔn)。隨著三維視景仿真系統(tǒng)規(guī)模的增大,三維實(shí)體建模工作耗費(fèi)時(shí)間越來(lái)越長(zhǎng),占據(jù)了系統(tǒng)開發(fā)的大量時(shí)間,延長(zhǎng)了視景仿真系統(tǒng)開發(fā)周期[1],因此就三維建模存在的建模耗時(shí)長(zhǎng),擴(kuò)展難等問題,對(duì)可組合的建模技術(shù)提出了更高的需求。可組合建模即對(duì)多個(gè)模型中共同的部分進(jìn)行建模,后期根據(jù)需求以裝配的方式組裝成所需的模型即可。目前對(duì)OpenFlight模型可組合性研究比較少,就OpenFlight模型建模存在的問題,王嬌艷等使用OpenFlight AP I函數(shù)擴(kuò)展了Creator,實(shí)現(xiàn)了模型細(xì)調(diào)、重組等功能,縮短了建模時(shí)間,但是在模型控制方面沒進(jìn)一步研究[2]。姚林海等利用配置表描述模型的組裝擴(kuò)展信息,在模型加載過程中實(shí)現(xiàn)了模型重組,雖然根據(jù)配置表實(shí)現(xiàn)了模型的按部件控制,但是在仿真前期對(duì)模型的修改非常不直觀[3]。李榮江等利用分塊技術(shù)實(shí)現(xiàn)了模型的分塊建立[4],在后期仿真過程中,模型的部件可以根據(jù)視點(diǎn)的遠(yuǎn)近動(dòng)態(tài)加載,加快了模型的加載速度和顯示幀頻。
本文首先對(duì)OpenFlight模型數(shù)據(jù)格式進(jìn)行研究,利用OpenFlight API函數(shù)通過對(duì)模型數(shù)據(jù)的讀取、修改、組合和寫入等方式實(shí)現(xiàn)了多個(gè)OpenFlight模型的組合,并提供了友好的人機(jī)界面實(shí)現(xiàn)模型的可視化組合,完善了模型可組合建模工具,大大縮短了建模時(shí)間,加快了視景仿真系統(tǒng)的開發(fā)周期。
Creator是軟件源碼不可獲取的商品化的虛擬現(xiàn)實(shí)建模工具,但是Multigen-Paradigm公司提供了OpenFlight API對(duì)Creator的功能進(jìn)行擴(kuò)展和對(duì)OpenFlight模型進(jìn)行讀取操作,因此可以利用OpenFlight API讀取三維模型的數(shù)據(jù)對(duì)模型數(shù)據(jù)進(jìn)行調(diào)整組合操作,然后再根據(jù)用戶需求寫成一個(gè)三維模型數(shù)據(jù)文件,即可實(shí)現(xiàn)三維模型的組件化建模技術(shù)[5]。OpenFlight API是一個(gè)基于C語(yǔ)言的二次開發(fā)函數(shù)庫(kù),它提供了訪問OpenFlight數(shù)據(jù)庫(kù)和Creator模型系統(tǒng)的接口方法。通過API可以進(jìn)行OpenFlight模型的轉(zhuǎn)換、實(shí)時(shí)的模擬仿真、自動(dòng)建模以及通過插件的形式對(duì)Creator進(jìn)行功能擴(kuò)展。OpenFlight API函數(shù)庫(kù)的功能函數(shù)主要分成讀取、寫入、擴(kuò)展和工具四個(gè)不同操作功能模塊,對(duì)于構(gòu)建OpenFlight模型來(lái)說(shuō),使用其中的讀取和寫入兩個(gè)模塊的OpenFlight API函數(shù)即可。
OpenFlight三維模型建模方式主要可以擴(kuò)展為兩種:一種是通過Creator建模工具直接進(jìn)行三位實(shí)體建模來(lái)得到OpenFlight模型,另一種是通過creator建模工具建立各組件,然后利用該模型組合工具來(lái)得到OpenFlight模型[6]??偫ㄟ@兩種建模方式,OpenFlight三維模型建模流程如下所示。
(1)首先對(duì)所建模型的三維實(shí)體進(jìn)行分析,將其拆分為幾個(gè)不同的組件,劃分的目的是使各模型更容易通過組合實(shí)現(xiàn)模型的構(gòu)建,模型組合也可以使用已有的模型組件。
(2)對(duì)于單個(gè)實(shí)體的建模,一般不需要拆分,直接利用Creator建模即可。對(duì)于拆分好的組件,一一建模即可。
(3)利用該軟件組合模型,完成多個(gè)模型的初步建模工作。
(4)在進(jìn)行導(dǎo)出模型前,需要對(duì)紋理圖片,LOD和面片等進(jìn)行校正、拼接等處理,這樣可以減少優(yōu)化模型。然后導(dǎo)出生成模型即可。
(5)完成整個(gè)三維對(duì)象模型的構(gòu)建工作。
OpenFlight格式及OpenFlight API是Multigen開發(fā)的,在視覺仿真領(lǐng)域最為流行的標(biāo)準(zhǔn)文件格式。OpenFlight采用幾何層次結(jié)構(gòu)和節(jié)點(diǎn)(數(shù)據(jù)庫(kù)頭節(jié)點(diǎn)、組、物體、面等)屬性來(lái)描述三維物體,數(shù)據(jù)節(jié)點(diǎn)種類很多,其常用的數(shù)據(jù)節(jié)點(diǎn)類型如表1所示。各類型的節(jié)點(diǎn)具有不同的屬性信息,其中一些屬性使用屬性調(diào)色板索引號(hào)來(lái)描述,如顏色、材質(zhì)、紋理等。在OpenFlight模型中,數(shù)據(jù)節(jié)點(diǎn)大致包括:根節(jié)點(diǎn)、組節(jié)點(diǎn)、體節(jié)點(diǎn)、面節(jié)點(diǎn)和點(diǎn)節(jié)點(diǎn)等五大類,這些節(jié)點(diǎn)按照樹狀結(jié)構(gòu)組織起來(lái)。一個(gè)OpenFlight數(shù)據(jù)庫(kù)的層次結(jié)構(gòu)被作為一個(gè)文件存儲(chǔ)在磁盤上。模型以0,1二進(jìn)制代碼存儲(chǔ),8位為一字節(jié),字節(jié)的存儲(chǔ)順序是按照正序方式存儲(chǔ)的。所有的模型文件都是以4個(gè)字節(jié)開始記錄。前兩個(gè)字節(jié)代表記錄類型,后兩個(gè)字節(jié)代表文件長(zhǎng)度。其中在相鄰節(jié)點(diǎn)上,子節(jié)點(diǎn)隸屬于父節(jié)點(diǎn)無(wú)論是在空間位置還是功能上,而兄弟節(jié)點(diǎn)之間則存在著一定的相關(guān)性。OpenFlight的這種樹狀多層結(jié)構(gòu)允許用戶直接對(duì)樹根節(jié)點(diǎn)和下屬各節(jié)點(diǎn)進(jìn)行操作,保證了從大型模型數(shù)據(jù)庫(kù)每個(gè)頂點(diǎn)的精確控制[7]。
表1 OpenFlight主要數(shù)據(jù)節(jié)點(diǎn)的說(shuō)明Tab.1 Main data node of OpenFlight
利用OpenFlight API對(duì)OpenFlight文件進(jìn)行基本讀寫的流程主要包括程序初始化,創(chuàng)建頭節(jié)點(diǎn),新建組節(jié)點(diǎn)以及其他節(jié)點(diǎn)等,然后繪制幾何節(jié)點(diǎn),并建立節(jié)點(diǎn)間的層級(jí)關(guān)系,最后寫入并關(guān)閉數(shù)據(jù)庫(kù),程序退出等若干步驟。具體流程如下:
(1)程序主參數(shù)進(jìn)行初始化;
(2)新建頭節(jié)點(diǎn),建立數(shù)據(jù)庫(kù)集;
(3) 創(chuàng)建節(jié)點(diǎn)(光照,聲音,DOF,LOD,…),并給記錄集屬性賦值;
(4)通過若干三維坐標(biāo)創(chuàng)建頂點(diǎn)集;
(5)創(chuàng)建若干子面 addVertex,組成面集makePoly;
(6)創(chuàng)建若干體節(jié)點(diǎn)fltObject,組成組節(jié)點(diǎn)fltGroup;
(7)寫入數(shù)據(jù)文件形成模型文件mgWriteDb(db)。
3.2.1 組件的添加
添加組件主要指將組件庫(kù)中的組件模型添加到其他模型中,形成一個(gè)新的模型供仿真使用。其中組件以該子節(jié)點(diǎn)的形式在所裝備的主模型中顯示,為了使導(dǎo)出模型與紋理的路徑不相關(guān),在此都使用絕對(duì)路徑。組件添加采用將組件以外部擴(kuò)展節(jié)點(diǎn)的調(diào)用方式加到主模型中。利用外部擴(kuò)展節(jié)點(diǎn),可以更加快速、方便地組合模型。這樣做也便于后期將完整模型拆分成相對(duì)獨(dú)立的組件模型,對(duì)于拆下來(lái)的組件模型還可以應(yīng)用到組件模型庫(kù)的構(gòu)建中,從而提高了模型的利用率。
添加組件節(jié)點(diǎn)的具體實(shí)現(xiàn)代碼步驟如下:
得到當(dāng)前的數(shù)據(jù)庫(kù)頭節(jié)點(diǎn)mgGetCu rrentDb();
新建一個(gè)Group節(jié)點(diǎn)mgNewRec();
創(chuàng)建一個(gè)外部節(jié)點(diǎn)mgNewRec();
選擇的組件文件mgListGetSe lectedItemString();
將選擇的文件設(shè)置為外部節(jié)點(diǎn)mgSetA ttL ist();
將外部節(jié)點(diǎn)作為新建Group節(jié)點(diǎn)子節(jié)點(diǎn)mgA ttach();
寫入數(shù)據(jù)庫(kù)頭節(jié)點(diǎn)mgW riteDb()。
添加組件模型后,在Creator中的結(jié)構(gòu)如圖1所示。
圖1 模型結(jié)構(gòu)Fig.1 Model structure
3.2.2 組件的刪除
組件的刪除主要是指將外部添加進(jìn)來(lái)的外部節(jié)點(diǎn)刪除,由于外部組件都是添加了一個(gè)節(jié)點(diǎn),所以從模型中刪除一個(gè)組件模型可以通過刪除其父節(jié)點(diǎn)而實(shí)現(xiàn),代碼如下:
g=mgGetRecByName(db,selectFullFltName);//選擇節(jié)點(diǎn)
mgDelete(g);//刪除節(jié)點(diǎn)
3.2.3 組件的移動(dòng)
模型的移動(dòng)首先需要定義兩個(gè)點(diǎn),一個(gè)點(diǎn)是模型初始位置,另一個(gè)點(diǎn)是模型中心要移動(dòng)的差值點(diǎn),然后將這兩點(diǎn)賦給fltXmTranslate格式記錄集,模型經(jīng)過記錄集的變換即可實(shí)現(xiàn)模型的移動(dòng)。具體代碼如下:
mgrec* c=gNewRec(fltXmTranslate);//定義記錄集
mgSetCoord3d(c,fltXmTranslateFrom,a1,a2,a3);//設(shè)置模型初始位置點(diǎn)
mgSetCoord3d(c,fltXmTranslateDelta,b1,b2,b3);//設(shè)置模型移動(dòng)差值量
mgAttach(g,c);//將組件進(jìn)行移動(dòng)
3.2.4 組件的旋轉(zhuǎn)與縮放
模型的旋轉(zhuǎn)與縮放在此提供繞xyz軸旋轉(zhuǎn)和縮放,通過選擇中心點(diǎn)、旋轉(zhuǎn)軸和旋轉(zhuǎn)角度或縮放系數(shù)即可實(shí)現(xiàn)模型的旋轉(zhuǎn)與縮放,具體代碼實(shí)現(xiàn)如下:
mgrec*x=mgNewRec(fltXmRo tate);
mgSetCoord3d( x,fltXmRotateCenter,a1,a2,a3);//選擇中心點(diǎn)
mgSetVector(x,fltXmRotateAx is,0,0,1);//選擇以z軸為旋轉(zhuǎn)縮放軸
m gSetA ttList(x,fltXmSca leZ,z,MG_NULL)//以z軸縮放z倍
mgSetAttList(x,fltXmRotateAngle,50,MG _NULL);//設(shè)置旋轉(zhuǎn)角度為50°
mgAttach(g,x);//旋轉(zhuǎn)與縮放模型
圖2為模型平移縮放后在Creator中的結(jié)構(gòu)圖。
圖2 模型結(jié)構(gòu)圖Fig.2 Model structure
按照以上的框架設(shè)計(jì)和操作模型的基本功能,基于 MFC 單文檔框架、vegaprime 2.2和OpenFlight API編程實(shí)現(xiàn)了模型可組合建模工具,其界面如圖3所示。該工具具有良好的人機(jī)交互編輯模型功能,以所見即所得的形式提供模型元件的平移、旋轉(zhuǎn)、縮放等幾何變換操作和拆分、組合等編輯操作以實(shí)現(xiàn)模型的可組合構(gòu)建。
圖3 可組合建模工具運(yùn)行界面Fig.3 Interface of the modeling tools
在此利用該工具將一架飛機(jī)和若干導(dǎo)彈進(jìn)行了組合建模(圖4,圖5)。
圖4 分離的導(dǎo)彈和飛機(jī)Fig.4 Missiles and aircraft
圖5 組合過程和組合模型Fig.5 Process and portfolio model
本文通過調(diào)用OpenFlight API接口語(yǔ)言,實(shí)現(xiàn)了通過組裝模型組件建立完整模型的功能,并且模型組件可以被任意刪除、移動(dòng)、旋轉(zhuǎn)、縮放等,解決了模型可組合建模的問題。這樣可以充分利用已有的模型資源,減少虛擬模型的建模工作量。但是本文對(duì)模型的紋理編輯,LOD節(jié)點(diǎn)、DOF節(jié)點(diǎn)等特殊節(jié)點(diǎn)編輯功能還未實(shí)現(xiàn),有待進(jìn)一步解決。
[1] 李榮江,趙剛,陳雷.基于Creator的分塊技術(shù)研究與實(shí)現(xiàn)[J].四川理工學(xué)院學(xué)報(bào):自然科學(xué)版,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三維模型數(shù)據(jù)庫(kù)優(yōu)化技術(shù)[J].系統(tǒng)仿真技術(shù),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的導(dǎo)彈飛行視景仿真系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].四川兵工學(xué)報(bào),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] 常彥博,李智.虛擬三維地形模型的建模技術(shù)研究[J].桂林航天工業(yè)學(xué)院學(xué)報(bào),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].計(jì)算機(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模型編輯器的設(shè)計(jì)與實(shí)現(xiàn)[J].石家莊鐵道學(xué)院學(xué)報(bào):自然科學(xué)版,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.