董鴻鵬 姜本清 方 偉
(海軍航空工程學院信息融合研究所 煙臺 264001)
?
基于OpenGL的三維模型渲染技術研究*
董鴻鵬 姜本清 方 偉
(海軍航空工程學院信息融合研究所 煙臺 264001)
物體三維模型的渲染是仿真領域中的一個重要方面,論文以OpenFlight模型為例,設計了一種基于OpenGL的三維模型渲染方法。分析了OpenFlight模型的格式特點,根據其特點利用API實現了基于OpenGL的三維模型正確表現,并可在渲染后對目標模型進行采樣、面片選擇等進一步處理。仿真結果顯示了該方案的有效性。
三維模型; OpenGL; OpenFlight
Class Number TP391.9
隨著計算機仿真技術、虛擬現實技術的飛速發展,如何建立一個高質量、高精度且數據易于處理的三維物體模型成為一個越來越重要的問題。
OpenFlight是由Multigen公司開發的由Creator軟件生成的一種用于存儲空間模型數據和圖像信息的空間數據格式,被認為是目前虛擬現實領域中空間數據格式的工業標準。但由于其應用平臺的限制性,只能對模型進行有限的處理。目前支持不同模型格式進行相互間操作的軟件接口較少且效果不高,可拓展的應用范圍有限。
為使OpenFlight模型得到進一步應用,如計算三維模型的電磁散射特性、與其格式他模型和軟件平臺進行數據交互等,本文基于OpenGL的圖形渲染功能和Visual Studio的編程功能,實現讀取OpenFlight模型文件并對其進行再處理。
OpenFlight是一種按層次組織的邏輯化場景描述數據庫。一般的OpenFlight模型由幾何對象數據、屬性和層次結構三方面組成。幾何對象數據以一系列有序的三維坐標的集合描述了幾何對象。屬性包括一些如紋理、材質等方面的附加內容[1]。層次結構將數據節點以層次化的邏輯結構組織起來,適用于實時顯示。OpenFlight三維數據庫將各層數據節點按樹狀結構進行組織,如圖1所示,子節點在空間位置或功能上隸屬于父節點,兄弟節點之間則存在著相關性。不同類型的節點擁有不同的屬性信息,其中一些屬性如顏色、材質、紋理等,使用屬性表索引號來描述。
OpenFlight文件由線性的二進制流記錄組成,所有字節都按照Big Endian(低地址存放最高有效字節)方式存儲。為了方便用戶快速解讀和構建OpenFlight文件,Multigen公司提供了獨立于建模平臺的二次開發函數庫OpenFlight API,包含了四類不同功能的函數: 1) 讀取函數,用于遍歷數據庫并查詢其中的信息; 2) 寫入函數,用于創建和編輯OpenFlight數據庫中的節點; 3) 擴展函數,用于創建OpenFlight數據庫中新類型節點或節點的新屬性; 4) 工具函數,注冊和插入用戶自定義的插件和算法。這些函數使開發者不需過多關注二進制文件的底層結構細節[2,8,10]。

圖1 OpenFlight模型結構

圖2 OpenFlight模型讀取流程
OpenFlight用結合層次結構和節點(數據庫頭結點、組、物體、面等)屬性來描述三維物體,允許用戶直接對層次結構及節點進行操作,實現了從大型數據庫到物體單個頂點的精確控制[3~4]。因此,要完全獲取OpenFlight數據格式文件的信息并正確渲染出來需要很大的工作量,在一般的仿真場景下也沒有必要。可先利用OpenFlight API獲取數據庫中所有多邊形的信息,包括三維實體的頂點坐標、頂點法向量、紋理坐標和多邊形的材質、紋理等,然后將這些信息儲存在多邊形鏈表中,利用OpenGL來渲染三維模型。
OpenFlight數據庫的儲存信息分為兩個部分:一個部分是數據庫的公用信息,包括紋理、光照、材質、聲音等,通過pallete(托盤)的形式放在根節點上的;另一部分是三維模型中所有多邊形面的幾何和渲染信息,這些信息則分別存儲在各個多邊形節點上。因此三維模型在渲染上也分成兩個部分:一個部分是紋理數據的預讀取,首先利用函數將紋理數據讀入內存,然后將其綁定,把綁定索引值和紋理索引值對應起來,這樣下一部多邊形渲染的時候就能按索引值找到對應的紋理;另一部分是多邊形的渲染,從頭至尾遍歷多邊形鏈表,調用函數根據每一個多邊形的屬性進行繪制[5,9]。
程序具體實現過程:
1) 創建紋理、材質、頂點坐標、多邊形等結構體鏈表作為基本類;
struct vertex{double x,y,z; float i,j,k;…}
struct texture{…}
struct polygon {…}
…
2) 利用API的mgOpenDb(…)使程序進入到FLT文件的頭結點,開始提取三維模型數據;
3) 編輯函數分別對模型的紋理、材質、頭結點和視點位置信息進行讀取;
loadTexture(…);
loadMateria(…);
readHeader(…);
loadEyepoint(…);
4) OpenFlight是以三角面片形式提供頂點的信息,因此在提取時可將模型以三角面片為基本存儲單位,利用循環函數,將模型的基本信息存儲在一個多邊形結構體的鏈表中;
5) 將多邊形結構體鏈表和上一步中提取的紋理鏈表利用索引值對應起來;
6) 利用函數mgCloseDb(…)關閉FLT文件,清理程序緩存。
OpenGL(Open Graphic Library)是一個優秀的三維圖形硬件的軟件接口(Application Programming Interface,API),同時也是一個跨平臺、開放性的三維圖形和模型庫。OpenGL在不同平臺上都具有非常快的渲染速度,是高性能圖形和交互性場景處理的行業標準[6]。
在使用OpenGL渲染前,必須根據模型對OpenGL做合理的初始設定,如繪制前首先要對場景進行初始化:創建窗體,設置OpenGL繪圖窗口大小、投影模式,定義視圖體,設置光源,定義視點位置、視角和視線方向等等。為更準確的觀察、使用渲染后的模型,程序使用函數glTranslatef(…)、glScaled(…)和glRotatef(…)來實現模型的移動、縮放和旋轉。
在OpenGL中,深度表示像素點在3D世界中距離攝像機的距離(繪制坐標),深度緩存中儲存著每個像素點的深度值。為使在繪制時避免后繪制的物體把先繪制的物體覆蓋掉,可以利用OpenGL的深度檢測功能[7]。
啟動深度檢測,打開深度檢測開關并設置檢測方式:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
并且在完成繪圖以后,實現禁止深度檢測:
glDisable(GL_DEPTH_TEST);
為驗證程序的正確性,用Creator軟件分別建立了B2轟炸機和某型艦船的三維模型,對比圖3和圖4,可看出渲染效果較好證明了程序的實用性。


圖3 B2飛機模型在Creator和本文程序中的對比


圖4 艦船模型在Creator和本文程序中的對比
通過把OpenFlight三維模型從限制性比較強的Creator軟件轉換到編輯功能強大的Visual Studio平臺上,可以對模型數據進行處理實現更多功能。
5.1 三維模型面片選擇
由于OpenFlight模型底層是由三角面片構成,故可對模型的基本三角面片信息進行編輯,實現如設置模型紋理等功能,方便進一步進行圖像仿真等處理。
在渲染時,暫時先不將多邊形鏈表與紋理鏈表對應,而直接將其繪出。并在繪制時設置相鄰多邊形顏色不同,便于區分。

圖5 面片選擇
為實現面片選取功能,程序采用線面相交法,即判斷鼠標垂直于幕布的直線是否與模型面片相交:首先,在選擇模式下,點擊鼠標時獲取鼠標點的坐標和其垂直于幕布的法向量;然后將其與所有多邊形的法向量進行比較,求出與之相垂直的多邊形;再判斷鼠標法向量與多邊形是否有交點,有交點即為選擇成功,改變顯示顏色為紅色,否則選擇失敗不做改變。
判斷交點時可先求出直線與多邊形所在平面的交點,然后通過判斷該點是否在多邊形內來判斷直線與多邊形是否存在交點。
5.2 三維模型的取點采樣
建立模型很多情況下需要對模型進行取點采樣,如計算點反射率等,取點方法可仿照上文中面片選取的原理。首先根據需求確定采樣的分辨率,以分辨率為基準設置方向一致的射線群。然后求出每條射線與多邊形的交點即可作為采樣點。
根據不同的采樣要求,可通過設置射線群方向、同一直線不同交點的高度差等信息來調節,通比如過選擇離雷達最近的交點來實現遮擋效應等,最后將需要的交點保存到文件中,便于后續計算。
本文提出的三維模型渲染方法拓展了OpenFlight模型的應用范圍,并可在此基礎上對模型作進一步更復雜的處理,提高了其應用價值。最后實驗渲染效果也較好,在工程實踐上尤其是飛行仿真軟件設計、雷達成像仿真軟件等方面有一定的使用價值。
[1] 肖羽,李光耀,王文舉.基于3DS的OpenFlight模型構建方法[J].計算機應用,2009,29:302-304.
[2] 羅丹,蔣自成,王躍峰.OpenFlight模型的OpenGL接口研究[C]//2005全國仿真技術會議論文集,2005:402-404,446.
[3] Donald Hearn, M. Pauline Baker.計算機圖形學[M].第三版.北京:電子工業出版社,2010:330-380.
[4] Richard S. Wright, Nicholas Haemel. OpenGL超級寶典[M].第五版.北京:人民郵電出版社,2012:25-57,84-109.
[5] 方偉,何友,歐陽文,等.基于OpenFlight的數字地形處理軟件包設計及應用[J].計算機仿真,2006,11:291-295.
[6] 常遠,秦小麟,夏斌.基于CNSDTF和OpenFlight的空間數據互操作研究[J].中國圖像圖形學報,2005,10:1554-1559.
[7] 王靜,席澤敏,周超.OpenGL在計算目標電磁散射特性中的應用[J].船電技術,2012,32:30-32.
[8] 劉立嘉,劉裕嘉.OpenFlight模型編輯器的設計與實現[J].石家莊鐵道學院學報,2009,22:54-56.
[9] 唐凱,康鳳舉,宋志明,等.用OpenFlight API開發分地形[J].艦船電子工程,2004,75:74-77.
[10] 王陽生.基于OpenFlight的三維地形自動紋理映射方法[J].城市勘測,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日
董鴻鵬,男,碩士研究生,研究方向:戰場環境仿真。姜本清,男,教授,碩士生導師,研究方向:軍用電子技術仿真。方偉,男,副教授,研究方向:作戰系統仿真。
TP391.9
10.3969/j.issn.1672-9730.2015.10.030