《電子技術(shù)應用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > 基于OpenGL的三維地形可視化的研究與實現(xiàn)

基于OpenGL的三維地形可視化的研究與實現(xiàn)

2009-09-21
作者:劉 清 邢 航 黃 珍

  摘? 要: 針對三維地形可視化開發(fā)中的幾個關(guān)鍵技術(shù)進行了詳細的研究和討論,并以OpenGL開發(fā)語言為基礎,分析了實現(xiàn)三維地形地貌可視化的基本步驟。

  關(guān)鍵詞: 三維地形? 投影變換? 紋理映射? 動態(tài)顯示

?

  隨著計算機及圖形圖像技術(shù)的發(fā)展,地形可視化的應用越來越廣泛。三維地形可視化是研究數(shù)字地形模型(Digital Terrain Model,DTM)或數(shù)字高程域(Digital Height Field)中顯示、簡化、仿真等內(nèi)容的學科。常用的三維開發(fā)語言主要有OpenGL、Direct3D、VRML等。由于OpenGL與3DS、3Dmax相比具有可實時交互操作的優(yōu)點,所以更適合于空間信息的三維構(gòu)建,因此它的應用最為廣泛。本文介紹在某一實時監(jiān)控項目的開發(fā)中,基于OpenGL實現(xiàn)的三維地形地貌可視化的開發(fā)技術(shù)和實現(xiàn)方法。

1? 三維地形建模

  三維地形的建模是三維地形可視化的核心內(nèi)容。本文首先探討了三維地形可視化中地形建模的方法,然后討論了三維可視化過程中的幾個關(guān)鍵技術(shù)。

1.1 數(shù)字地面模型

  數(shù)字地面模型DTM是在一定的地域范圍內(nèi)按一定的規(guī)則獲取和記錄一些點的高程而形成的用來描述地形的數(shù)字模型[2]。常用的地面取點方式有二種:一種是非等間隔取點,即根據(jù)地面的變化率決定取點的位置和疏密。在高度變化較緩的區(qū)域取點相對較少,反之較多;另一種是等間隔取點,即取點的行列間隔是固定不變的。在數(shù)據(jù)存儲上,前者節(jié)約空間且獲取的地形信息較多,但數(shù)據(jù)結(jié)構(gòu)復雜,運算處理困難;后者雖然數(shù)據(jù)結(jié)構(gòu)簡單,特別是每個點有隱含坐標,使運算處理較為容易、編程實現(xiàn)比較方便,但容易丟失一些地形信息,有時存在冗余數(shù)據(jù)。

  DTM數(shù)據(jù)實質(zhì)上是空間離散點的集合,生成三維地形的過程就是用這些離散點逼近地形曲面的過程。目前三維地形模型大多采用數(shù)字地面模型生成。本文中DTM數(shù)據(jù)由等間隔取點所得到的高程值構(gòu)成。

1.2 三維地形建模方法

  計算機圖形學中,利用多邊形構(gòu)造曲面時應考慮以下因素:

  (1)保持多邊形的方向一致性(通常每個多邊形均取逆時針方向)。

  (2)盡量選用三角形來逼近,這樣可以保證多邊形上的所有點共面。

  (3)避免構(gòu)造過程中出現(xiàn)T型點,因為T型點將導致繪制時出現(xiàn)裂痕。解決辦法是增加一條指向T型點的邊。

  (4)避免使用狹長三角形,應盡量選用各邊長度接近的三角型。狹長三角形會使繪制的結(jié)果顏色變化太尖銳。

  (5)要正確處理好圖像質(zhì)量和繪制速度的矛盾,因此應選用適當?shù)亩噙呅螖?shù)目。

  由于OpenGL只能處理凸多邊形,加上對上述因素的考慮,本文在設計開發(fā)過程中主要采用把整個地形曲面化分為多個小的三角曲面,然后由這些三角曲面拼接成整個地形曲面的方法。拼接方法如圖1所示。

?

?

  為了達到地形曲面的光滑,應使各三角曲面拼接處的法向量不產(chǎn)生突變。本方法的重點在于求各點的法向量。法向量同時還關(guān)系到每個頂點所能獲得的光照量,從而影響整個場景的視覺效果。OpenGL本身并未提供計算法向量的函數(shù),計算法向量的工作必須自己完成,這樣就具有更大的靈活性。本文采用最常用的平均平面法向量法。

  在三維視圖中,每一個面都有二個方向,因此計算三角面法向量時必須按相同的順序(順時針或逆時針方向)從三角面取二條有向邊,計算其叉積,然后將該叉積進行單位化,就得到該三角面的法向量。而求每個頂點的法向量時將頂點周圍六個三角面的法向量的平均值作為該頂點的法向量即可。在OpenGL中再通過插值,可求得三角曲面上每一點的法相量,從而獲得一塊光滑的三角曲面。

2? 三維地形的可視化

  在OpenGL中實現(xiàn)三維地形可視化的基本過程如圖2所示。其中,參數(shù)設置主要包括光源性質(zhì)、光源方位、顏色模式、明暗處理方式、紋理映射方式的設置等。這些參數(shù)設置都可以通過OpenGL的相關(guān)函數(shù)來實現(xiàn)。視口變換就是將三維空間坐標映射為計算機屏幕上的二維平面坐標,用glViewport()實現(xiàn)。以下就其中的光照計算、投影變換和紋理映射技術(shù)進行重點分析。

?

?

2.1 光照計算

  根據(jù)所求的頂點法向量,可以求出各個頂點處的光強值。假設地形表面為一個漫反射體,光源為無窮遠處的點光源,根據(jù)朗伯余弦定理,任一地形點的光強為:

  

  其中:L為點光源單位入射向量;N為所求點的法線向量;I0、Ie分別為環(huán)境光和入射光的光強;K0、Kd為環(huán)境和入射光的反射系數(shù)。

2.2 投影變換

  在OpenGL中,投影變換分為正交投影和透視投影二種。二種投影變換的顯著區(qū)別是視景體的不同。在透視投影中(如圖3),視景體是一個棱錐的平截臺體,即為一個被平行于地面的平面裁掉頂端的棱錐。同樣一個物體,距離視點較近比遠離視點時在視景體中占據(jù)更大的比例,因此在平截臺體的粗端將顯得大一些。由于這種投影方法類似于人眼的視覺機制,通常用于強調(diào)真實感的場合,所以在三維地形可視化中采用透視投影。

  圖3中近平面P1和遠平面P2為矩形且互相平行。視點到近平面的距離為n,到遠平面的距離為f。設近平面左下角點a1的三維空間坐標為(l,b,n),右上角點c1的三維空間坐標為(r,t,n),則透視投影變換可用下列矩陣P表示:

  

?

?

  透視投影變換實際上就是用矩陣P乘三維空間點的坐標運算。

2.3 紋理映射

  紋理映射是把紋理影像“貼”到由DTM數(shù)據(jù)所構(gòu)成的三維模型上,它是建立具有真實感的三維地形地貌的重要手段。紋理映射的關(guān)鍵是實現(xiàn)影像與DTM之間的正確套合,使每個DTM網(wǎng)格點與其所在的影像位置一一對應,保證紋理在變換時與所附著的曲面保持適當?shù)年P(guān)系。對于原始影像,可以根據(jù)成像時的幾何關(guān)系,利用共線方程解算出每一個DTM網(wǎng)格點所對應的像坐標,將其作為紋理映射時的紋理坐標依據(jù)。

  紋理映射有二個問題需要重點考慮。①內(nèi)存與速度之間的矛盾。由于加入了圖像紋理,使得著色算法變得復雜化,明顯影響了三維地形的顯示速度。如果在三維地形多分辨率模型中加入多分辨率的紋理,即將圖像分成多級分辨率,然后根據(jù)視點的變化來選擇其中的分辨率,這就更增加了內(nèi)存與速度之間的矛盾。②大尺寸圖像的疊加問題。通常軟件系統(tǒng)(如OpenGL)只支持1024×1024的圖像尺寸。如果有一個高分辨率的圖像,圖像尺寸是4096×4096,則需要將大圖像分成較小的尺寸(如512×512),同時將地形也相應分成較小的地形塊,將圖像塊與地形塊疊加后,再將它們拼接起來。為了防止拼接縫的產(chǎn)生,在設計分塊時讓塊與塊之間保留少量的重疊。紋理映射時,OpenGL會自動根據(jù)周圍像點的像素值來決定拼接處像點的像素值,從而避免拼接縫的產(chǎn)生。OpenGL中紋理映射的基本操作步驟如下:

  (1)定義紋理。用glTexImage2D()函數(shù)說明所映射的紋理內(nèi)容,其中包括紋理數(shù)據(jù)的指針、紋理的大小、紋理的類別(灰度或色彩)等。簡單的紋理是一個圖像。

  (2)紋理控制。用來說明紋理以何種方式映射到三維模型表面上,OpenGL提供的函數(shù)為glTexParameter*()。可以把紋理作為象素的最終顏色,用紋理覆蓋原有的象素段;也可以把光照與紋理后的效果結(jié)合起來,調(diào)整或放大象素段的顏色。另外也可以用基于紋理值的一個固定顏色與象素段顏色混合。

  (3)使用紋理映射。在繪制場景前,先調(diào)用glEnable(GL_TEXTURE_1D)或glEnable(GL_TEXTURE_2D)函數(shù),允許使用一維和二維紋理映射。在紋理映射過程中,可以用紋理來調(diào)整三維模型的顏色或?qū)⒓y理與三維模型原來的顏色進行融合,其調(diào)整函數(shù)為glTexEnv*()。

  (4)繪制場景。定義三維模型頂點的紋理坐標與幾何坐標。幾何坐標決定了頂點在屏幕上的繪制位置,紋理坐標決定紋理圖像中哪一個紋理單元賦予該頂點,其調(diào)整函數(shù)為glTexCoord*()。在曲面上只繪制一份紋理圖案,則四個角坐標分別為(0,0)、(1,0)、(0,1)、(1,1)。

  需要注意的是:紋理映射只能在RGBA模式下使用,不適用于顏色索引模式。計算紋理坐標必須準確,否則將導致紋理變形。

3? 三維地形實時動態(tài)顯示

  三維地形僅僅靜態(tài)顯示還不夠,它需要交互式地實時動態(tài)顯示。除了必要的硬件之外,OpenGL所特有的顯示列表和雙緩存機制也為實現(xiàn)三維景觀的實時動態(tài)提供了有力的保證。

  顯示列表是OpenGL為了提高程序的運行效率而引入的“批處理”技術(shù),是預先存儲的、用于稍后執(zhí)行的一組OpenGL命令序列。激活一個顯示列表后,就可按照顯示列表中預先排好的次序執(zhí)行其存儲的命令。顯示列表是不可修改的,一旦建立,OpenGL就將其處理成適合于圖形硬件的格式,而且可以避免在繪圖過程中因主機計算量過大而影響圖形生成的速度,從而提高了效率。雙緩存技術(shù)提供前后二個緩存,在顯示前臺緩存內(nèi)容的一幀圖像時,后臺正在繪制下一幀的圖像;后臺繪制完成后,交換前后臺緩存,不斷地循環(huán),實現(xiàn)地形的實時動態(tài)顯示。OpenGL中雙緩存是通過調(diào)用auxSwapBuffers()函數(shù)實現(xiàn)的。

  地形實時動態(tài)顯示一般有二種方式:一種是視點固定、目標移動,目標本身的變化包括目標的平移、旋轉(zhuǎn)和縮放等。這種顯示方式較容易實現(xiàn),而且平行投影和透視投影二種投影方式都可以采用。另一種是目標固定、視點移動。這種顯示方式實現(xiàn)起來較復雜,因為目標固定、視點沿路徑運動,因此必須采用透視投影才能達到仿真效果。本文中三維地形的動態(tài)顯示即采用第二種方式。

4? 結(jié)束語

  根據(jù)上文介紹的技術(shù),在CPU為PⅢ800、內(nèi)存為128MB、Windows2000環(huán)境下,以VC6.0為開發(fā)平臺、OpenGL為工具,進行了水下三維地形的動態(tài)顯示仿真。所繪制的某一水下地形顯示地形地貌效果良好。本文的研究還很基礎,對于三維數(shù)據(jù)的采集、壓縮、插值、建模、顯示速度等方面還有許多問題有待進一步研究。

?

參考文獻

1? 王永明.地形可視化.中國圖像圖形學報.2000;(6)

2? 郭文普,孫繼銀.視景生成中的幾個關(guān)鍵技術(shù).系統(tǒng)仿真學報,2001;(11)

3? 吳剛.ZZC02雷達裝甲車系統(tǒng)軟件的研制.成都:電子科技大學碩士學位論文,2001

4? 柴小文,王金巖,田翼.三維數(shù)字地形圖生成技術(shù)研究.航空電子技術(shù),2002;(12)

5? 戴晨光,朱述龍.利用OpenGL實現(xiàn)三維地形的快速動態(tài)顯示.測繪通報.1998;(6)

6? 高武俊,張繼賢,張永紅.基于OpenGL的三維地形可視化研究.測繪通報,2002(增刊)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。