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