廖宏剛,劉 榮
(桂林電子科技大學(xué) 電子工程與自動(dòng)化學(xué)院,廣西 桂林541004)
“數(shù)字地球”的概念在1998年美國(guó)副總統(tǒng)戈?duì)栐诩永D醽喛茖W(xué)中心發(fā)表的“數(shù)字地球:21世紀(jì)認(rèn)識(shí)地球的方式”[1]報(bào)告中被提出,引起了各國(guó)的廣泛關(guān)注。1998年我國(guó)召開了第一屆“數(shù)字地球”國(guó)際會(huì)議,數(shù)字地球的構(gòu)建受到高度重視。數(shù)字地球的核心思想是用數(shù)字化手段來(lái)處理整個(gè)地球的自然和社會(huì)活動(dòng)等方面的問題,最大限度利用資源,并使普通百姓能夠通過一定方式方便獲得他們所想了解的有關(guān)地球的信息,它的特點(diǎn)是嵌入海量地理數(shù)據(jù),實(shí)現(xiàn)多分辨率、對(duì)地球進(jìn)行三維的描述,即“虛擬地球”。
總之,地理信息系統(tǒng)的普及加快了數(shù)字地球的高速發(fā)展,在國(guó)家空間數(shù)據(jù)基礎(chǔ)設(shè)施(NSDI)中,數(shù)字地形模擬的相關(guān)研究成果已成為其基本內(nèi)容,并植入到數(shù)字化空間框架中,進(jìn)行集約化、規(guī)?;a(chǎn),試圖將其打造成為獨(dú)立的標(biāo)準(zhǔn)產(chǎn)品[2]。因此三維真實(shí)感地形圖的生成是當(dāng)前研究的熱點(diǎn)。
OpenGL被定義為“圖形硬件的一種軟件接口”,是一個(gè)3D圖形和模型庫(kù),具有高度的可移植性,除了可以在Windows系統(tǒng)中進(jìn)行應(yīng)用,還可以在Unix/Linux等其它系統(tǒng)甚至各種大型計(jì)算機(jī)中進(jìn)行使用,做到了與硬件甚至與平臺(tái)無(wú)關(guān)[2]。OpenGL是一個(gè)工業(yè)標(biāo)準(zhǔn),可以創(chuàng)建優(yōu)雅漂亮的3D圖形,并且具有出色的視覺質(zhì)量,如今顯卡廠商均支持OpenGL,激烈的競(jìng)爭(zhēng)使OpenGL的性能保持領(lǐng)先。OpenGL不是一種編程語(yǔ)言,而是一些C函數(shù)。
在MFC下編程需要以下幾個(gè)步驟:(1)創(chuàng)建工程,把OpenGL文件和庫(kù)加入到工程,用AppWizard建立一個(gè)單文檔的應(yīng)用程序,鏈接opengl32.lib、glu32.lib兩文件,在視類里添加OpenGL所需要包含的頭文件。(2)通過PreCreateWindow函數(shù)定義窗口的風(fēng)格。(3)添加消息響應(yīng)函數(shù)WM_CREATE,在函數(shù)里獲取DC、設(shè)置像素的格式、創(chuàng)建RC。(4)添加消息響應(yīng)處理函數(shù)WM_SIZE,建立視點(diǎn)、開啟透視變換和建立視景體。(5)添加消息響應(yīng)函數(shù)WM_ERASEBKGND,使得該函數(shù)不執(zhí)行,返回TRUE,這樣才消除重繪引起的閃爍。(6)添加響應(yīng)WM_DESTROY,釋放RC和D。(7)在OnDraw函數(shù)里繪制想繪的圖形。(8)編譯運(yùn)行程序。
高低起伏的地球表面其曲面不能用平面地圖表示。所以用數(shù)字高程模型的方法來(lái)表示,這種方法已被廣泛使用[3]。數(shù)字高程模型,用來(lái)表示地形特征空間分布的模型,它是按照一定的結(jié)構(gòu)以數(shù)字形式組織在一起,是地形起伏和形狀大小的一種數(shù)字描述。
數(shù)字高程模型有3種主要模型:規(guī)則格網(wǎng)模型、等高線模型和不規(guī)則三角網(wǎng)。規(guī)則格網(wǎng)模型有較多不足,比如在地形平坦地方,存在大量數(shù)據(jù)冗余,難以表達(dá)出復(fù)雜地形突變現(xiàn)象。在數(shù)字地形建模中,不規(guī)則三角網(wǎng)(TIN)表現(xiàn)的最優(yōu)秀,它可以減少規(guī)則格網(wǎng)帶來(lái)的數(shù)據(jù)冗余問題,在計(jì)算坡度效率方面又優(yōu)于基于等高線的方法,它通過用一系列互不交叉也互不重疊的連接在一起的三角面片來(lái)逼近地形表面。不規(guī)則三角網(wǎng)可以由于地形的復(fù)雜性而通過改變采樣點(diǎn)的密度以及決定采樣點(diǎn)的位置,從而能夠避免地形平坦時(shí)的數(shù)據(jù)冗余。三角形在形狀、大小方面有較大靈活性,它能很好地?cái)M合地形,同時(shí)又比較容易地融合斷裂線、生成線,所以基于三角形的這種方法,在地形表面建模中應(yīng)用越來(lái)越多,成為表面建模的主要方法。
物體的表面通常都有紋理,采用紋理映射給計(jì)算機(jī)所繪制的物體加上紋理,使得物體更加三維逼真,視覺效果會(huì)更好。沒有采用紋理貼圖的地形模型只有光照的明暗效果,無(wú)法重現(xiàn)地表的真實(shí)面貌[4]。
地形的紋理映射貼圖的過程就是把紋理圖像貼到三維模型上。要注意實(shí)現(xiàn)DEM和影像的正確匹配,使得DEM網(wǎng)格點(diǎn)與影像的位置形成一一對(duì)應(yīng)的關(guān)系。
紋理貼圖需要以下幾個(gè)基本步驟:(1)紋理的定義。紋理貼圖的過程中,對(duì)紋理圖像的尺寸是有要求的,它必須是2的N次方,N為>0的整數(shù),圖像尺寸應(yīng)>1 024。它需要定義指向具體哪個(gè)紋理的數(shù)據(jù)指針,還有紋理大小,紋理的類別等,這些都通過調(diào)用glTexImage2D()函數(shù)來(lái)確定。(2)紋理控制。說(shuō)明所使用的紋理是以哪種方式映射到三維物體表面上。(3)紋理映射方式說(shuō)明。紋理可以用來(lái)替代地形模型的顏色,也可以將紋理與所繪制的地形顏色進(jìn)行融合。這是通過調(diào)用glTexParameterf()函數(shù)來(lái)實(shí)現(xiàn)的。(4)紋理的啟用。在地形的繪制前必須先調(diào)用開啟紋理函數(shù)glEnable(GL_TEXTURE_2D)。(5)紋理坐標(biāo)與幾何坐標(biāo)的對(duì)應(yīng)。幾何坐標(biāo)決定了將地形在顯示器屏幕上的顯示位置,通過調(diào)用函數(shù)glVertex*()來(lái)確定;紋理坐標(biāo)決定了紋理圖像中的哪個(gè)紋理單元賦予這個(gè)頂點(diǎn),通過調(diào)用實(shí)現(xiàn)的函數(shù)是glTexCoord*(),它們必須匹配,才能有良好的視覺效果。
為使三維效果更加的逼真,可以通過在MFC的OpenGL繪圖框架里添加消息響應(yīng)通過glScale(),glTranslate*(),glRotate*()函數(shù)分別實(shí)現(xiàn)地形的放大、縮小、旋轉(zhuǎn),平移等功能,達(dá)到不同的三維視覺效果[5]。
本實(shí)例在Windows7系統(tǒng)上,以Visual C++和Opengl為開發(fā)平臺(tái),用上述方法,生成了一個(gè)真實(shí)感三維地形。其三維地形模型如圖所示。
圖1為由原始點(diǎn)云生成的灰度圖像,它是一幅平面圖像,沒有立體效果。其灰度信息是根據(jù)整個(gè)場(chǎng)景的高程信息來(lái)賦值,最低點(diǎn)到最高點(diǎn)分別對(duì)應(yīng)灰度值的0和255,即灰度值根據(jù)高程信息做0~255的線性拉伸。
圖1 二維灰度圖象
圖2為由原始點(diǎn)云生成數(shù)字高程模型后進(jìn)行紋理映射得到的整個(gè)真實(shí)感場(chǎng)景效果圖,在這個(gè)圖中可以明顯地看出立體效果。通過此界面可以看出,這是在MFC下實(shí)現(xiàn)的OpenGL繪圖顯示,可以通過菜單選項(xiàng)里的圖形變化方便地對(duì)圖像操作,實(shí)現(xiàn)放大縮小、選擇、平移,并可以從各個(gè)視角去觀看。
圖2 三維真實(shí)感地形整個(gè)場(chǎng)景圖
圖3為圖2的局部放大圖,三維立體感明顯,具有良好的3D視覺效果。
圖3 三維真實(shí)感地形場(chǎng)景局部放大圖
文中通過對(duì)地形的三維可視化的實(shí)現(xiàn)表明基于MFC和OpenGL相結(jié)合再使用紋理映射能更好地實(shí)現(xiàn)地形的動(dòng)態(tài)三維模擬。
[1]AL GORE.The digital earth:understanding our planet in the 21st century[M].Given at the California Science Center,Los Angeles,California,1998.
[2] 李志林,朱慶.數(shù)字高程模型[M].武漢:武漢大學(xué)出版社,2001.
[3] 劉少華,程朋根,陳斐,等.TIN構(gòu)建算法的研究及OpenGL下三維可視化[J].計(jì)算機(jī)工程與應(yīng)用,2003(18):72-74.
[4]DAVE S.OpenGL Programming Guide[M].李軍,徐波,譯.北京:機(jī)械工業(yè)出版社,2010.
[5] 田紅鵬,馬苗.OpenGL及其基于VC++6.0的開發(fā)[J].西安科技學(xué)院學(xué)報(bào),2001(4):365-368.