肖 坤,閆浩文,張志華
(1.蘭州交通大學 測繪與地理信息學院,甘肅 蘭州,730070)
基于OpenGL的3ds數據可視化
肖 坤1,閆浩文1,張志華1
(1.蘭州交通大學 測繪與地理信息學院,甘肅 蘭州,730070)

探討了基于OpenGL的3ds文件讀取、繪制和控制方法,從三維模型在地形中移動的坡度和坡向問題入手,逼真地模擬了3ds文件模型在GRID地形中移動的交互控制過程。開發的三維模擬可視化實驗系統,在3ds文件模型和GRID地形的貼合程度方面效果良好。
OpenGL;3ds;三維可視化;交互控制
OpenGL是一個開源的三維圖形軟件包,作為一個性能優越的圖形應用程序設計界面,被廣泛地應用于各種計算機環境中,成為三維圖形開發的標準[1]。目前,GRID地形和三維模型的可視化已經被廣泛地應用于地形模擬和景觀仿真等方面,但模型運動的自主性不強,貼合度不好[2,3]。本文將建立的3ds文件利用Visual C++快速導入到實驗系統,通過研究該模型文件的讀取、繪制與控制方法,結合規則格網GRID模型的特點,實現了3ds文件模型在凸凹不平GRID地形的交互控制移動過程,以及三維模型與GRID地形的動態實時貼合。本文方法在模型的移動和位置關系的結合上,取得良好效果,可為三維動態模擬、三維模型之間的貼合以及場景快速構建等提供技術參考。
3ds文件是最常見的一種三維模型保存格式,具有獲取方式多樣、保存方便等特點。本文使用的3ds文件通過3ds max建模獲得,建模過程在此不再詳細說明。
3ds文件由許多“塊”組成,是一個塊的嵌套結構。每一個“塊”由兩部分組成:ID和下一個數據塊的位置[4]。基本塊包含兩個主塊,分別是3D編輯器塊和關鍵幀塊,前者ID是0x3D3D,后者ID是0xB000。在3D編輯器塊中,有圖形的頂點列表、三角形列表、面列表、材質、顏色等信息。接下來描述該塊的數據信息及其子塊,子塊的描述與上一級塊相同。但不是所有的塊都含有子塊,可以用塊的長度與偏移量(如表中的 6+n)比較來判斷是否包含子塊[5]。本文主要用到的是3D編輯器塊。“塊”的定義如表1。

表1 3ds文件結構
2.1 數據結構
3ds文件都是按照塊模式存儲,因此可將塊結構定義如下:
struct t_Chunk
{
unsigned short int ID; //塊的ID
unsigned int length; //塊的ID
unsigned int bytes_Read; //塊讀入的字節數
};
在數據的讀取過程中抽象出二、三維點、面和材質信息結構模型,然后得出三維對象模型定義如下:
struct t_3DObject
{
int num_Verts; //點的個數
int num_Faces; //面的個數
int numTexVertex; //材質坐標的個數
int materialID; //材質的ID
char strName[255]; //對象的名稱
CVector3 *pVerts; //對象的頂點
CVector3 *pNormals; //對象的法線
CVector2 *pTexVerts; //紋理的UV坐標
t_Face *pFaces; //對象的面信息
};
然后再由對象模型抽象和繪制出整個場景,獲得整個場景的畫面。下面為三維模型的定義:
struct t_3DModel
{
int num_Objects; //對象的個數
int num_Materials; //材質的個數
vector<t_MaterialInfo> pMaterials;
//材料信息的列表(材質和顏色)
vector<t_3DObject> pObject;
//模型的對象列表
}
2.2 讀取流程
3ds文件由chunk構成,每一個chunk包括一個頭和一個主體,chunk的頭又由兩部分組成:塊的ID,chunk的長度[6]。chunk是相互嵌套的,這就要求必須以遞歸的方式進行讀取,主要涉及RGB顏色、燈光、頂點、面、UV坐標、材質、紋理坐標等,詳細讀取過程見圖1。

圖1 讀取流程
2.3 定 位
在GRID地形上模擬三維實體模型的行進過程,需要解決的關鍵問題是如何將其在凸凹不平的GRID地形上停放。本文將越野車作為三維實體進行研究,首先把越野車抽象成一個長方體,然后判斷長方體的下表面是否和地表該點的貼面重合,若重合則表明可以實現停放,亦即只要長方體下表面的法線方向和地面點的法線方向一致,就可實現停放。具體旋轉只需要知道該點地形的坡度和坡向的兩個角度值,就可以通過OpenGL中的旋轉矩陣實現。其中,越野車在GRID地形上行進時坡度和坡向的計算可分為以下3種情況(圖2)。

圖2 格網示意圖
1)當越野車(點5)到達一個正方形表面時(圖2a),可由正方形表面的法線方向得到坡度S和坡向A的信息。
2)當越野車(點5)到達兩個正方形邊界時(除頂點外)(圖2b),可以將兩個正方形表面的單位法線的平均值作為邊界上點的法線方向。可由點5的法線得到坡度S、坡向A。

3)當越野車到達四個正方形的共享頂點5時(圖2c),由于點5的坡度S、坡向A可以看作地形曲面函數Z = f ( x , y )在東西、南北方向上高程變化率的函數[7,8],即式中,fx和fy分別為東西、南北方向上的高程變化率。本文中fx和fy的計算由相鄰的2個點獲得其在2個方向上的變化率。例如圖中點5的變化率由點2和點8、點4和點6獲得其在東西、南北兩個方向上的變化率[9,10]。
一般情況下,車的動力是有限的,以我國現行最大坡度建議值[11]為例,若車速100 km/h,坡度建議值imax為5,坡度大于這個建議值時停止移動。
2.4 其他操作控制
本文對3ds模型在GRID地形中轉彎采用旋轉的方式進行控制。在坐標系統中,順時針為負,逆時針為正,在此設定一個角速度去控制它旋轉的角度,當角速度為正時為左轉彎,反之為右轉彎。此外還實現了勻速、加速行駛等功能,加速采用設定加速度累加方式實現,設定最大速度進行限制。
整個場景的放大、縮小、改變視角旋轉等操作都是通過相應的矩陣進行控制[3-4]。
本文的實驗系統首先讀入一個越野車模型的3ds文件,然后對其添加控制,使之可以隨GRID地表起伏,對正常的行進過程進行模擬。在此把越野車模型抽象為一個長方形,在模擬地形上移動過程時對其左右方向進行旋轉控制(左轉彎和右轉彎),對車頭和車尾隨地表起伏上下偏移進行旋轉控制,然后在移動過程中確定越野車模型在每個點的位置和旋轉狀態,并進行顯示。整體效果如圖3所示。

圖3 系統整體效果圖
本文基于OpenGL技術在VC中實現3ds文件的瀏覽和交互控制,并實現越野車模型在簡單GRID地形中的正常移動,著重講解了3ds文件的讀取過程和模型在其中的控制方法,及其坡度坡向對模型在移動過程中的影響。該技術可以有效地模擬三維模型的構建,
及其動態顯示和移動過程,方法簡單直觀,與地形表面的貼合程度效果好,效率較高,極大地縮短了三維開發的周期,對三維建模及動態交互控制方面的研究具有借鑒意義。
[1] Shreiner D.OpenGL Programming Guide:the Official Guide to Learning OpenGL,Versions 3.0 and 3.1[M]. Boston:Pearson Education,2009
[2] 閆志剛. GIS 專業地學可視化課程的建設與教學實踐[J]. 地理空間信息, 2011, 9(4): 159-161
[3] 劉芳,劉賢梅.3DS文件讀取、繪制與控制方法的研究與應用[J].計算機工程與設計,2009,30(19): 4 575-4 578
[4] 殷素峰,高雪強,楊勝強.在OpenGL環境下開發3DS文件瀏覽器[J].工程圖學學報,2005,26(6): 22-24
[5] 蔡強,李海生,陳誼.3DS文件瀏覽器的設計與實現[J].系統仿真學報,2008, 20(增刊): 147-149
[6] 劉虎, 陳漢文. 基于 3DS MAX 的校園三維模型室內外一體化制作[J]. 地理空間信息, 2013 (2): 53-54
[7] 郭仁忠.空間分析[M].北京:高等教育出版社,2001
[8] Spatial Analysis and GIS[M]. Cleveland, Ohio: CRC Press,2004
[9] 湯國安,李軍鋒.規則格網DEM坡度坡向算法的比較分析[J].干旱區地理,2004,1(9): 398-403
[10] 洪瑩, 王繼周, 李昂. 地形特征提取的一種簡易算法[J]. 測繪科學, 2009, 34(6): 125-127
[11] 裴玉龍,邢恩輝.高等級公路縱坡的坡度、坡長限制分析[J].哈爾濱工業大學學報,2005,37(5): 629-632
P208
B
1672-4623(2014)05-0082-03
10.3969/j.issn.1672-4623.2014.05.029
肖坤,碩士,主要從事三維GIS的開發工作。
2014-03-24。
項目來源:國家科技支撐計劃資助項目(2013BAB05B01)。