肖 坤,閆浩文,張志華
(1.蘭州交通大學(xué) 測(cè)繪與地理信息學(xué)院,甘肅 蘭州,730070)
基于OpenGL的3ds數(shù)據(jù)可視化
肖 坤1,閆浩文1,張志華1
(1.蘭州交通大學(xué) 測(cè)繪與地理信息學(xué)院,甘肅 蘭州,730070)
探討了基于OpenGL的3ds文件讀取、繪制和控制方法,從三維模型在地形中移動(dòng)的坡度和坡向問題入手,逼真地模擬了3ds文件模型在GRID地形中移動(dòng)的交互控制過程。開發(fā)的三維模擬可視化實(shí)驗(yàn)系統(tǒng),在3ds文件模型和GRID地形的貼合程度方面效果良好。
OpenGL;3ds;三維可視化;交互控制
OpenGL是一個(gè)開源的三維圖形軟件包,作為一個(gè)性能優(yōu)越的圖形應(yīng)用程序設(shè)計(jì)界面,被廣泛地應(yīng)用于各種計(jì)算機(jī)環(huán)境中,成為三維圖形開發(fā)的標(biāo)準(zhǔn)[1]。目前,GRID地形和三維模型的可視化已經(jīng)被廣泛地應(yīng)用于地形模擬和景觀仿真等方面,但模型運(yùn)動(dòng)的自主性不強(qiáng),貼合度不好[2,3]。本文將建立的3ds文件利用Visual C++快速導(dǎo)入到實(shí)驗(yàn)系統(tǒng),通過研究該模型文件的讀取、繪制與控制方法,結(jié)合規(guī)則格網(wǎng)GRID模型的特點(diǎn),實(shí)現(xiàn)了3ds文件模型在凸凹不平GRID地形的交互控制移動(dòng)過程,以及三維模型與GRID地形的動(dòng)態(tài)實(shí)時(shí)貼合。本文方法在模型的移動(dòng)和位置關(guān)系的結(jié)合上,取得良好效果,可為三維動(dòng)態(tài)模擬、三維模型之間的貼合以及場(chǎng)景快速構(gòu)建等提供技術(shù)參考。
3ds文件是最常見的一種三維模型保存格式,具有獲取方式多樣、保存方便等特點(diǎn)。本文使用的3ds文件通過3ds max建模獲得,建模過程在此不再詳細(xì)說明。
3ds文件由許多“塊”組成,是一個(gè)塊的嵌套結(jié)構(gòu)。每一個(gè)“塊”由兩部分組成:ID和下一個(gè)數(shù)據(jù)塊的位置[4]。基本塊包含兩個(gè)主塊,分別是3D編輯器塊和關(guān)鍵幀塊,前者ID是0x3D3D,后者ID是0xB000。在3D編輯器塊中,有圖形的頂點(diǎn)列表、三角形列表、面列表、材質(zhì)、顏色等信息。接下來描述該塊的數(shù)據(jù)信息及其子塊,子塊的描述與上一級(jí)塊相同。但不是所有的塊都含有子塊,可以用塊的長(zhǎng)度與偏移量(如表中的 6+n)比較來判斷是否包含子塊[5]。本文主要用到的是3D編輯器塊?!皦K”的定義如表1。
表1 3ds文件結(jié)構(gòu)
2.1 數(shù)據(jù)結(jié)構(gòu)
3ds文件都是按照塊模式存儲(chǔ),因此可將塊結(jié)構(gòu)定義如下:
struct t_Chunk
{
unsigned short int ID; //塊的ID
unsigned int length; //塊的ID
unsigned int bytes_Read; //塊讀入的字節(jié)數(shù)
};
在數(shù)據(jù)的讀取過程中抽象出二、三維點(diǎn)、面和材質(zhì)信息結(jié)構(gòu)模型,然后得出三維對(duì)象模型定義如下:
struct t_3DObject
{
int num_Verts; //點(diǎn)的個(gè)數(shù)
int num_Faces; //面的個(gè)數(shù)
int numTexVertex; //材質(zhì)坐標(biāo)的個(gè)數(shù)
int materialID; //材質(zhì)的ID
char strName[255]; //對(duì)象的名稱
CVector3 *pVerts; //對(duì)象的頂點(diǎn)
CVector3 *pNormals; //對(duì)象的法線
CVector2 *pTexVerts; //紋理的UV坐標(biāo)
t_Face *pFaces; //對(duì)象的面信息
};
然后再由對(duì)象模型抽象和繪制出整個(gè)場(chǎng)景,獲得整個(gè)場(chǎng)景的畫面。下面為三維模型的定義:
struct t_3DModel
{
int num_Objects; //對(duì)象的個(gè)數(shù)
int num_Materials; //材質(zhì)的個(gè)數(shù)
vector<t_MaterialInfo> pMaterials;
//材料信息的列表(材質(zhì)和顏色)
vector<t_3DObject> pObject;
//模型的對(duì)象列表
}
2.2 讀取流程
3ds文件由chunk構(gòu)成,每一個(gè)chunk包括一個(gè)頭和一個(gè)主體,chunk的頭又由兩部分組成:塊的ID,chunk的長(zhǎng)度[6]。chunk是相互嵌套的,這就要求必須以遞歸的方式進(jìn)行讀取,主要涉及RGB顏色、燈光、頂點(diǎn)、面、UV坐標(biāo)、材質(zhì)、紋理坐標(biāo)等,詳細(xì)讀取過程見圖1。
圖1 讀取流程
2.3 定 位
在GRID地形上模擬三維實(shí)體模型的行進(jìn)過程,需要解決的關(guān)鍵問題是如何將其在凸凹不平的GRID地形上停放。本文將越野車作為三維實(shí)體進(jìn)行研究,首先把越野車抽象成一個(gè)長(zhǎng)方體,然后判斷長(zhǎng)方體的下表面是否和地表該點(diǎn)的貼面重合,若重合則表明可以實(shí)現(xiàn)停放,亦即只要長(zhǎng)方體下表面的法線方向和地面點(diǎn)的法線方向一致,就可實(shí)現(xiàn)停放。具體旋轉(zhuǎn)只需要知道該點(diǎn)地形的坡度和坡向的兩個(gè)角度值,就可以通過OpenGL中的旋轉(zhuǎn)矩陣實(shí)現(xiàn)。其中,越野車在GRID地形上行進(jìn)時(shí)坡度和坡向的計(jì)算可分為以下3種情況(圖2)。
圖2 格網(wǎng)示意圖
1)當(dāng)越野車(點(diǎn)5)到達(dá)一個(gè)正方形表面時(shí)(圖2a),可由正方形表面的法線方向得到坡度S和坡向A的信息。
2)當(dāng)越野車(點(diǎn)5)到達(dá)兩個(gè)正方形邊界時(shí)(除頂點(diǎn)外)(圖2b),可以將兩個(gè)正方形表面的單位法線的平均值作為邊界上點(diǎn)的法線方向??捎牲c(diǎn)5的法線得到坡度S、坡向A。
3)當(dāng)越野車到達(dá)四個(gè)正方形的共享頂點(diǎn)5時(shí)(圖2c),由于點(diǎn)5的坡度S、坡向A可以看作地形曲面函數(shù)Z = f ( x , y )在東西、南北方向上高程變化率的函數(shù)[7,8],即式中,fx和fy分別為東西、南北方向上的高程變化率。本文中fx和fy的計(jì)算由相鄰的2個(gè)點(diǎn)獲得其在2個(gè)方向上的變化率。例如圖中點(diǎn)5的變化率由點(diǎn)2和點(diǎn)8、點(diǎn)4和點(diǎn)6獲得其在東西、南北兩個(gè)方向上的變化率[9,10]。
一般情況下,車的動(dòng)力是有限的,以我國(guó)現(xiàn)行最大坡度建議值[11]為例,若車速100 km/h,坡度建議值imax為5,坡度大于這個(gè)建議值時(shí)停止移動(dòng)。
2.4 其他操作控制
本文對(duì)3ds模型在GRID地形中轉(zhuǎn)彎采用旋轉(zhuǎn)的方式進(jìn)行控制。在坐標(biāo)系統(tǒng)中,順時(shí)針為負(fù),逆時(shí)針為正,在此設(shè)定一個(gè)角速度去控制它旋轉(zhuǎn)的角度,當(dāng)角速度為正時(shí)為左轉(zhuǎn)彎,反之為右轉(zhuǎn)彎。此外還實(shí)現(xiàn)了勻速、加速行駛等功能,加速采用設(shè)定加速度累加方式實(shí)現(xiàn),設(shè)定最大速度進(jìn)行限制。
整個(gè)場(chǎng)景的放大、縮小、改變視角旋轉(zhuǎn)等操作都是通過相應(yīng)的矩陣進(jìn)行控制[3-4]。
本文的實(shí)驗(yàn)系統(tǒng)首先讀入一個(gè)越野車模型的3ds文件,然后對(duì)其添加控制,使之可以隨GRID地表起伏,對(duì)正常的行進(jìn)過程進(jìn)行模擬。在此把越野車模型抽象為一個(gè)長(zhǎng)方形,在模擬地形上移動(dòng)過程時(shí)對(duì)其左右方向進(jìn)行旋轉(zhuǎn)控制(左轉(zhuǎn)彎和右轉(zhuǎn)彎),對(duì)車頭和車尾隨地表起伏上下偏移進(jìn)行旋轉(zhuǎn)控制,然后在移動(dòng)過程中確定越野車模型在每個(gè)點(diǎn)的位置和旋轉(zhuǎn)狀態(tài),并進(jìn)行顯示。整體效果如圖3所示。
圖3 系統(tǒng)整體效果圖
本文基于OpenGL技術(shù)在VC中實(shí)現(xiàn)3ds文件的瀏覽和交互控制,并實(shí)現(xiàn)越野車模型在簡(jiǎn)單GRID地形中的正常移動(dòng),著重講解了3ds文件的讀取過程和模型在其中的控制方法,及其坡度坡向?qū)δP驮谝苿?dòng)過程中的影響。該技術(shù)可以有效地模擬三維模型的構(gòu)建,
及其動(dòng)態(tài)顯示和移動(dòng)過程,方法簡(jiǎn)單直觀,與地形表面的貼合程度效果好,效率較高,極大地縮短了三維開發(fā)的周期,對(duì)三維建模及動(dòng)態(tài)交互控制方面的研究具有借鑒意義。
[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 專業(yè)地學(xué)可視化課程的建設(shè)與教學(xué)實(shí)踐[J]. 地理空間信息, 2011, 9(4): 159-161
[3] 劉芳,劉賢梅.3DS文件讀取、繪制與控制方法的研究與應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(19): 4 575-4 578
[4] 殷素峰,高雪強(qiáng),楊勝?gòu)?qiáng).在OpenGL環(huán)境下開發(fā)3DS文件瀏覽器[J].工程圖學(xué)學(xué)報(bào),2005,26(6): 22-24
[5] 蔡強(qiáng),李海生,陳誼.3DS文件瀏覽器的設(shè)計(jì)與實(shí)現(xiàn)[J].系統(tǒng)仿真學(xué)報(bào),2008, 20(增刊): 147-149
[6] 劉虎, 陳漢文. 基于 3DS MAX 的校園三維模型室內(nèi)外一體化制作[J]. 地理空間信息, 2013 (2): 53-54
[7] 郭仁忠.空間分析[M].北京:高等教育出版社,2001
[8] Spatial Analysis and GIS[M]. Cleveland, Ohio: CRC Press,2004
[9] 湯國(guó)安,李軍鋒.規(guī)則格網(wǎng)DEM坡度坡向算法的比較分析[J].干旱區(qū)地理,2004,1(9): 398-403
[10] 洪瑩, 王繼周, 李昂. 地形特征提取的一種簡(jiǎn)易算法[J]. 測(cè)繪科學(xué), 2009, 34(6): 125-127
[11] 裴玉龍,邢恩輝.高等級(jí)公路縱坡的坡度、坡長(zhǎng)限制分析[J].哈爾濱工業(yè)大學(xué)學(xué)報(bào),2005,37(5): 629-632
P208
B
1672-4623(2014)05-0082-03
10.3969/j.issn.1672-4623.2014.05.029
肖坤,碩士,主要從事三維GIS的開發(fā)工作。
2014-03-24。
項(xiàng)目來源:國(guó)家科技支撐計(jì)劃資助項(xiàng)目(2013BAB05B01)。