董鴻鵬 姜本清 方 偉
(海軍航空工程學(xué)院信息融合研究所 煙臺(tái) 264001)
?
基于OpenGL的三維模型渲染技術(shù)研究*
董鴻鵬 姜本清 方 偉
(海軍航空工程學(xué)院信息融合研究所 煙臺(tái) 264001)
物體三維模型的渲染是仿真領(lǐng)域中的一個(gè)重要方面,論文以O(shè)penFlight模型為例,設(shè)計(jì)了一種基于OpenGL的三維模型渲染方法。分析了OpenFlight模型的格式特點(diǎn),根據(jù)其特點(diǎn)利用API實(shí)現(xiàn)了基于OpenGL的三維模型正確表現(xiàn),并可在渲染后對(duì)目標(biāo)模型進(jìn)行采樣、面片選擇等進(jìn)一步處理。仿真結(jié)果顯示了該方案的有效性。
三維模型; OpenGL; OpenFlight
Class Number TP391.9
隨著計(jì)算機(jī)仿真技術(shù)、虛擬現(xiàn)實(shí)技術(shù)的飛速發(fā)展,如何建立一個(gè)高質(zhì)量、高精度且數(shù)據(jù)易于處理的三維物體模型成為一個(gè)越來越重要的問題。
OpenFlight是由Multigen公司開發(fā)的由Creator軟件生成的一種用于存儲(chǔ)空間模型數(shù)據(jù)和圖像信息的空間數(shù)據(jù)格式,被認(rèn)為是目前虛擬現(xiàn)實(shí)領(lǐng)域中空間數(shù)據(jù)格式的工業(yè)標(biāo)準(zhǔn)。但由于其應(yīng)用平臺(tái)的限制性,只能對(duì)模型進(jìn)行有限的處理。目前支持不同模型格式進(jìn)行相互間操作的軟件接口較少且效果不高,可拓展的應(yīng)用范圍有限。
為使OpenFlight模型得到進(jìn)一步應(yīng)用,如計(jì)算三維模型的電磁散射特性、與其格式他模型和軟件平臺(tái)進(jìn)行數(shù)據(jù)交互等,本文基于OpenGL的圖形渲染功能和Visual Studio的編程功能,實(shí)現(xiàn)讀取OpenFlight模型文件并對(duì)其進(jìn)行再處理。
OpenFlight是一種按層次組織的邏輯化場(chǎng)景描述數(shù)據(jù)庫(kù)。一般的OpenFlight模型由幾何對(duì)象數(shù)據(jù)、屬性和層次結(jié)構(gòu)三方面組成。幾何對(duì)象數(shù)據(jù)以一系列有序的三維坐標(biāo)的集合描述了幾何對(duì)象。屬性包括一些如紋理、材質(zhì)等方面的附加內(nèi)容[1]。層次結(jié)構(gòu)將數(shù)據(jù)節(jié)點(diǎn)以層次化的邏輯結(jié)構(gòu)組織起來,適用于實(shí)時(shí)顯示。OpenFlight三維數(shù)據(jù)庫(kù)將各層數(shù)據(jù)節(jié)點(diǎn)按樹狀結(jié)構(gòu)進(jìn)行組織,如圖1所示,子節(jié)點(diǎn)在空間位置或功能上隸屬于父節(jié)點(diǎn),兄弟節(jié)點(diǎn)之間則存在著相關(guān)性。不同類型的節(jié)點(diǎn)擁有不同的屬性信息,其中一些屬性如顏色、材質(zhì)、紋理等,使用屬性表索引號(hào)來描述。
OpenFlight文件由線性的二進(jìn)制流記錄組成,所有字節(jié)都按照Big Endian(低地址存放最高有效字節(jié))方式存儲(chǔ)。為了方便用戶快速解讀和構(gòu)建OpenFlight文件,Multigen公司提供了獨(dú)立于建模平臺(tái)的二次開發(fā)函數(shù)庫(kù)OpenFlight API,包含了四類不同功能的函數(shù): 1) 讀取函數(shù),用于遍歷數(shù)據(jù)庫(kù)并查詢其中的信息; 2) 寫入函數(shù),用于創(chuàng)建和編輯OpenFlight數(shù)據(jù)庫(kù)中的節(jié)點(diǎn); 3) 擴(kuò)展函數(shù),用于創(chuàng)建OpenFlight數(shù)據(jù)庫(kù)中新類型節(jié)點(diǎn)或節(jié)點(diǎn)的新屬性; 4) 工具函數(shù),注冊(cè)和插入用戶自定義的插件和算法。這些函數(shù)使開發(fā)者不需過多關(guān)注二進(jìn)制文件的底層結(jié)構(gòu)細(xì)節(jié)[2,8,10]。
圖1 OpenFlight模型結(jié)構(gòu)
圖2 OpenFlight模型讀取流程
OpenFlight用結(jié)合層次結(jié)構(gòu)和節(jié)點(diǎn)(數(shù)據(jù)庫(kù)頭結(jié)點(diǎn)、組、物體、面等)屬性來描述三維物體,允許用戶直接對(duì)層次結(jié)構(gòu)及節(jié)點(diǎn)進(jìn)行操作,實(shí)現(xiàn)了從大型數(shù)據(jù)庫(kù)到物體單個(gè)頂點(diǎn)的精確控制[3~4]。因此,要完全獲取OpenFlight數(shù)據(jù)格式文件的信息并正確渲染出來需要很大的工作量,在一般的仿真場(chǎng)景下也沒有必要。可先利用OpenFlight API獲取數(shù)據(jù)庫(kù)中所有多邊形的信息,包括三維實(shí)體的頂點(diǎn)坐標(biāo)、頂點(diǎn)法向量、紋理坐標(biāo)和多邊形的材質(zhì)、紋理等,然后將這些信息儲(chǔ)存在多邊形鏈表中,利用OpenGL來渲染三維模型。
OpenFlight數(shù)據(jù)庫(kù)的儲(chǔ)存信息分為兩個(gè)部分:一個(gè)部分是數(shù)據(jù)庫(kù)的公用信息,包括紋理、光照、材質(zhì)、聲音等,通過pallete(托盤)的形式放在根節(jié)點(diǎn)上的;另一部分是三維模型中所有多邊形面的幾何和渲染信息,這些信息則分別存儲(chǔ)在各個(gè)多邊形節(jié)點(diǎn)上。因此三維模型在渲染上也分成兩個(gè)部分:一個(gè)部分是紋理數(shù)據(jù)的預(yù)讀取,首先利用函數(shù)將紋理數(shù)據(jù)讀入內(nèi)存,然后將其綁定,把綁定索引值和紋理索引值對(duì)應(yīng)起來,這樣下一部多邊形渲染的時(shí)候就能按索引值找到對(duì)應(yīng)的紋理;另一部分是多邊形的渲染,從頭至尾遍歷多邊形鏈表,調(diào)用函數(shù)根據(jù)每一個(gè)多邊形的屬性進(jìn)行繪制[5,9]。
程序具體實(shí)現(xiàn)過程:
1) 創(chuàng)建紋理、材質(zhì)、頂點(diǎn)坐標(biāo)、多邊形等結(jié)構(gòu)體鏈表作為基本類;
struct vertex{double x,y,z; float i,j,k;…}
struct texture{…}
struct polygon {…}
…
2) 利用API的mgOpenDb(…)使程序進(jìn)入到FLT文件的頭結(jié)點(diǎn),開始提取三維模型數(shù)據(jù);
3) 編輯函數(shù)分別對(duì)模型的紋理、材質(zhì)、頭結(jié)點(diǎn)和視點(diǎn)位置信息進(jìn)行讀取;
loadTexture(…);
loadMateria(…);
readHeader(…);
loadEyepoint(…);
4) OpenFlight是以三角面片形式提供頂點(diǎn)的信息,因此在提取時(shí)可將模型以三角面片為基本存儲(chǔ)單位,利用循環(huán)函數(shù),將模型的基本信息存儲(chǔ)在一個(gè)多邊形結(jié)構(gòu)體的鏈表中;
5) 將多邊形結(jié)構(gòu)體鏈表和上一步中提取的紋理鏈表利用索引值對(duì)應(yīng)起來;
6) 利用函數(shù)mgCloseDb(…)關(guān)閉FLT文件,清理程序緩存。
OpenGL(Open Graphic Library)是一個(gè)優(yōu)秀的三維圖形硬件的軟件接口(Application Programming Interface,API),同時(shí)也是一個(gè)跨平臺(tái)、開放性的三維圖形和模型庫(kù)。OpenGL在不同平臺(tái)上都具有非??斓匿秩舅俣?是高性能圖形和交互性場(chǎng)景處理的行業(yè)標(biāo)準(zhǔn)[6]。
在使用OpenGL渲染前,必須根據(jù)模型對(duì)OpenGL做合理的初始設(shè)定,如繪制前首先要對(duì)場(chǎng)景進(jìn)行初始化:創(chuàng)建窗體,設(shè)置OpenGL繪圖窗口大小、投影模式,定義視圖體,設(shè)置光源,定義視點(diǎn)位置、視角和視線方向等等。為更準(zhǔn)確的觀察、使用渲染后的模型,程序使用函數(shù)glTranslatef(…)、glScaled(…)和glRotatef(…)來實(shí)現(xiàn)模型的移動(dòng)、縮放和旋轉(zhuǎn)。
在OpenGL中,深度表示像素點(diǎn)在3D世界中距離攝像機(jī)的距離(繪制坐標(biāo)),深度緩存中儲(chǔ)存著每個(gè)像素點(diǎn)的深度值。為使在繪制時(shí)避免后繪制的物體把先繪制的物體覆蓋掉,可以利用OpenGL的深度檢測(cè)功能[7]。
啟動(dòng)深度檢測(cè),打開深度檢測(cè)開關(guān)并設(shè)置檢測(cè)方式:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
并且在完成繪圖以后,實(shí)現(xiàn)禁止深度檢測(cè):
glDisable(GL_DEPTH_TEST);
為驗(yàn)證程序的正確性,用Creator軟件分別建立了B2轟炸機(jī)和某型艦船的三維模型,對(duì)比圖3和圖4,可看出渲染效果較好證明了程序的實(shí)用性。
圖3 B2飛機(jī)模型在Creator和本文程序中的對(duì)比
圖4 艦船模型在Creator和本文程序中的對(duì)比
通過把OpenFlight三維模型從限制性比較強(qiáng)的Creator軟件轉(zhuǎn)換到編輯功能強(qiáng)大的Visual Studio平臺(tái)上,可以對(duì)模型數(shù)據(jù)進(jìn)行處理實(shí)現(xiàn)更多功能。
5.1 三維模型面片選擇
由于OpenFlight模型底層是由三角面片構(gòu)成,故可對(duì)模型的基本三角面片信息進(jìn)行編輯,實(shí)現(xiàn)如設(shè)置模型紋理等功能,方便進(jìn)一步進(jìn)行圖像仿真等處理。
在渲染時(shí),暫時(shí)先不將多邊形鏈表與紋理鏈表對(duì)應(yīng),而直接將其繪出。并在繪制時(shí)設(shè)置相鄰多邊形顏色不同,便于區(qū)分。
圖5 面片選擇
為實(shí)現(xiàn)面片選取功能,程序采用線面相交法,即判斷鼠標(biāo)垂直于幕布的直線是否與模型面片相交:首先,在選擇模式下,點(diǎn)擊鼠標(biāo)時(shí)獲取鼠標(biāo)點(diǎn)的坐標(biāo)和其垂直于幕布的法向量;然后將其與所有多邊形的法向量進(jìn)行比較,求出與之相垂直的多邊形;再判斷鼠標(biāo)法向量與多邊形是否有交點(diǎn),有交點(diǎn)即為選擇成功,改變顯示顏色為紅色,否則選擇失敗不做改變。
判斷交點(diǎn)時(shí)可先求出直線與多邊形所在平面的交點(diǎn),然后通過判斷該點(diǎn)是否在多邊形內(nèi)來判斷直線與多邊形是否存在交點(diǎn)。
5.2 三維模型的取點(diǎn)采樣
建立模型很多情況下需要對(duì)模型進(jìn)行取點(diǎn)采樣,如計(jì)算點(diǎn)反射率等,取點(diǎn)方法可仿照上文中面片選取的原理。首先根據(jù)需求確定采樣的分辨率,以分辨率為基準(zhǔn)設(shè)置方向一致的射線群。然后求出每條射線與多邊形的交點(diǎn)即可作為采樣點(diǎn)。
根據(jù)不同的采樣要求,可通過設(shè)置射線群方向、同一直線不同交點(diǎn)的高度差等信息來調(diào)節(jié),通比如過選擇離雷達(dá)最近的交點(diǎn)來實(shí)現(xiàn)遮擋效應(yīng)等,最后將需要的交點(diǎn)保存到文件中,便于后續(xù)計(jì)算。
本文提出的三維模型渲染方法拓展了OpenFlight模型的應(yīng)用范圍,并可在此基礎(chǔ)上對(duì)模型作進(jìn)一步更復(fù)雜的處理,提高了其應(yīng)用價(jià)值。最后實(shí)驗(yàn)渲染效果也較好,在工程實(shí)踐上尤其是飛行仿真軟件設(shè)計(jì)、雷達(dá)成像仿真軟件等方面有一定的使用價(jià)值。
[1] 肖羽,李光耀,王文舉.基于3DS的OpenFlight模型構(gòu)建方法[J].計(jì)算機(jī)應(yīng)用,2009,29:302-304.
[2] 羅丹,蔣自成,王躍峰.OpenFlight模型的OpenGL接口研究[C]//2005全國(guó)仿真技術(shù)會(huì)議論文集,2005:402-404,446.
[3] Donald Hearn, M. Pauline Baker.計(jì)算機(jī)圖形學(xué)[M].第三版.北京:電子工業(yè)出版社,2010:330-380.
[4] Richard S. Wright, Nicholas Haemel. OpenGL超級(jí)寶典[M].第五版.北京:人民郵電出版社,2012:25-57,84-109.
[5] 方偉,何友,歐陽(yáng)文,等.基于OpenFlight的數(shù)字地形處理軟件包設(shè)計(jì)及應(yīng)用[J].計(jì)算機(jī)仿真,2006,11:291-295.
[6] 常遠(yuǎn),秦小麟,夏斌.基于CNSDTF和OpenFlight的空間數(shù)據(jù)互操作研究[J].中國(guó)圖像圖形學(xué)報(bào),2005,10:1554-1559.
[7] 王靜,席澤敏,周超.OpenGL在計(jì)算目標(biāo)電磁散射特性中的應(yīng)用[J].船電技術(shù),2012,32:30-32.
[8] 劉立嘉,劉裕嘉.OpenFlight模型編輯器的設(shè)計(jì)與實(shí)現(xiàn)[J].石家莊鐵道學(xué)院學(xué)報(bào),2009,22:54-56.
[9] 唐凱,康鳳舉,宋志明,等.用OpenFlight API開發(fā)分地形[J].艦船電子工程,2004,75:74-77.
[10] 王陽(yáng)生.基于OpenFlight的三維地形自動(dòng)紋理映射方法[J].城市勘測(cè),2011,3:52-54.
Researchof Data Change Based on OpenFlight Model
DONG Hongpeng JIANG Benqing FANG Wei
(Institution of Information Fusion, Naval Aeronautical and Astronautical University, Yantai 264001)
The rendering of 3D object model is an important aspect in the field of simulation. Taking the OpenFlight model as an example, a 3D model rendering method based on OpenGL is designed. The characteristics of OpenFlight model format are analyzed, and according to its characteristics the rendering, sampling and patch selecting of 3D object, are realized perfectly based on OpenGL with OpenFlight API. Simulation results show the effectiveness of the proposed project.
three-dimensional model, OpenGL, OpenFlight
2015年4月7日,
2015年5月24日
董鴻鵬,男,碩士研究生,研究方向:戰(zhàn)場(chǎng)環(huán)境仿真。姜本清,男,教授,碩士生導(dǎo)師,研究方向:軍用電子技術(shù)仿真。方偉,男,副教授,研究方向:作戰(zhàn)系統(tǒng)仿真。
TP391.9
10.3969/j.issn.1672-9730.2015.10.030