摘? 要: 針對(duì)三維地形可視化開發(fā)中的幾個(gè)關(guān)鍵技術(shù)進(jìn)行了詳細(xì)的研究和討論,并以O(shè)penGL開發(fā)語(yǔ)言為基礎(chǔ),分析了實(shí)現(xiàn)三維地形地貌可視化的基本步驟。
關(guān)鍵詞: 三維地形? 投影變換? 紋理映射? 動(dòng)態(tài)顯示
?
隨著計(jì)算機(jī)及圖形圖像技術(shù)的發(fā)展,地形可視化的應(yīng)用越來越廣泛。三維地形可視化是研究數(shù)字地形模型(Digital Terrain Model,DTM)或數(shù)字高程域(Digital Height Field)中顯示、簡(jiǎn)化、仿真等內(nèi)容的學(xué)科。常用的三維開發(fā)語(yǔ)言主要有OpenGL、Direct3D、VRML等。由于OpenGL與3DS、3Dmax相比具有可實(shí)時(shí)交互操作的優(yōu)點(diǎn),所以更適合于空間信息的三維構(gòu)建,因此它的應(yīng)用最為廣泛。本文介紹在某一實(shí)時(shí)監(jiān)控項(xiàng)目的開發(fā)中,基于OpenGL實(shí)現(xiàn)的三維地形地貌可視化的開發(fā)技術(shù)和實(shí)現(xiàn)方法。
1? 三維地形建模
三維地形的建模是三維地形可視化的核心內(nèi)容。本文首先探討了三維地形可視化中地形建模的方法,然后討論了三維可視化過程中的幾個(gè)關(guān)鍵技術(shù)。
1.1 數(shù)字地面模型
數(shù)字地面模型DTM是在一定的地域范圍內(nèi)按一定的規(guī)則獲取和記錄一些點(diǎn)的高程而形成的用來描述地形的數(shù)字模型[2]。常用的地面取點(diǎn)方式有二種:一種是非等間隔取點(diǎn),即根據(jù)地面的變化率決定取點(diǎn)的位置和疏密。在高度變化較緩的區(qū)域取點(diǎn)相對(duì)較少,反之較多;另一種是等間隔取點(diǎn),即取點(diǎn)的行列間隔是固定不變的。在數(shù)據(jù)存儲(chǔ)上,前者節(jié)約空間且獲取的地形信息較多,但數(shù)據(jù)結(jié)構(gòu)復(fù)雜,運(yùn)算處理困難;后者雖然數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,特別是每個(gè)點(diǎn)有隱含坐標(biāo),使運(yùn)算處理較為容易、編程實(shí)現(xiàn)比較方便,但容易丟失一些地形信息,有時(shí)存在冗余數(shù)據(jù)。
DTM數(shù)據(jù)實(shí)質(zhì)上是空間離散點(diǎn)的集合,生成三維地形的過程就是用這些離散點(diǎn)逼近地形曲面的過程。目前三維地形模型大多采用數(shù)字地面模型生成。本文中DTM數(shù)據(jù)由等間隔取點(diǎn)所得到的高程值構(gòu)成。
1.2 三維地形建模方法
計(jì)算機(jī)圖形學(xué)中,利用多邊形構(gòu)造曲面時(shí)應(yīng)考慮以下因素:
(1)保持多邊形的方向一致性(通常每個(gè)多邊形均取逆時(shí)針方向)。
(2)盡量選用三角形來逼近,這樣可以保證多邊形上的所有點(diǎn)共面。
(3)避免構(gòu)造過程中出現(xiàn)T型點(diǎn),因?yàn)門型點(diǎn)將導(dǎo)致繪制時(shí)出現(xiàn)裂痕。解決辦法是增加一條指向T型點(diǎn)的邊。
(4)避免使用狹長(zhǎng)三角形,應(yīng)盡量選用各邊長(zhǎng)度接近的三角型。狹長(zhǎng)三角形會(huì)使繪制的結(jié)果顏色變化太尖銳。
(5)要正確處理好圖像質(zhì)量和繪制速度的矛盾,因此應(yīng)選用適當(dāng)?shù)亩噙呅螖?shù)目。
由于OpenGL只能處理凸多邊形,加上對(duì)上述因素的考慮,本文在設(shè)計(jì)開發(fā)過程中主要采用把整個(gè)地形曲面化分為多個(gè)小的三角曲面,然后由這些三角曲面拼接成整個(gè)地形曲面的方法。拼接方法如圖1所示。
?
?
為了達(dá)到地形曲面的光滑,應(yīng)使各三角曲面拼接處的法向量不產(chǎn)生突變。本方法的重點(diǎn)在于求各點(diǎn)的法向量。法向量同時(shí)還關(guān)系到每個(gè)頂點(diǎn)所能獲得的光照量,從而影響整個(gè)場(chǎng)景的視覺效果。OpenGL本身并未提供計(jì)算法向量的函數(shù),計(jì)算法向量的工作必須自己完成,這樣就具有更大的靈活性。本文采用最常用的平均平面法向量法。
在三維視圖中,每一個(gè)面都有二個(gè)方向,因此計(jì)算三角面法向量時(shí)必須按相同的順序(順時(shí)針或逆時(shí)針方向)從三角面取二條有向邊,計(jì)算其叉積,然后將該叉積進(jìn)行單位化,就得到該三角面的法向量。而求每個(gè)頂點(diǎn)的法向量時(shí)將頂點(diǎn)周圍六個(gè)三角面的法向量的平均值作為該頂點(diǎn)的法向量即可。在OpenGL中再通過插值,可求得三角曲面上每一點(diǎn)的法相量,從而獲得一塊光滑的三角曲面。
2? 三維地形的可視化
在OpenGL中實(shí)現(xiàn)三維地形可視化的基本過程如圖2所示。其中,參數(shù)設(shè)置主要包括光源性質(zhì)、光源方位、顏色模式、明暗處理方式、紋理映射方式的設(shè)置等。這些參數(shù)設(shè)置都可以通過OpenGL的相關(guān)函數(shù)來實(shí)現(xiàn)。視口變換就是將三維空間坐標(biāo)映射為計(jì)算機(jī)屏幕上的二維平面坐標(biāo),用glViewport()實(shí)現(xiàn)。以下就其中的光照計(jì)算、投影變換和紋理映射技術(shù)進(jìn)行重點(diǎn)分析。
?
?
2.1 光照計(jì)算
根據(jù)所求的頂點(diǎn)法向量,可以求出各個(gè)頂點(diǎn)處的光強(qiáng)值。假設(shè)地形表面為一個(gè)漫反射體,光源為無窮遠(yuǎn)處的點(diǎn)光源,根據(jù)朗伯余弦定理,任一地形點(diǎn)的光強(qiáng)為:
其中:L為點(diǎn)光源單位入射向量;N為所求點(diǎn)的法線向量;I0、Ie分別為環(huán)境光和入射光的光強(qiáng);K0、Kd為環(huán)境和入射光的反射系數(shù)。
2.2 投影變換
在OpenGL中,投影變換分為正交投影和透視投影二種。二種投影變換的顯著區(qū)別是視景體的不同。在透視投影中(如圖3),視景體是一個(gè)棱錐的平截臺(tái)體,即為一個(gè)被平行于地面的平面裁掉頂端的棱錐。同樣一個(gè)物體,距離視點(diǎn)較近比遠(yuǎn)離視點(diǎn)時(shí)在視景體中占據(jù)更大的比例,因此在平截臺(tái)體的粗端將顯得大一些。由于這種投影方法類似于人眼的視覺機(jī)制,通常用于強(qiáng)調(diào)真實(shí)感的場(chǎng)合,所以在三維地形可視化中采用透視投影。
圖3中近平面P1和遠(yuǎn)平面P2為矩形且互相平行。視點(diǎn)到近平面的距離為n,到遠(yuǎn)平面的距離為f。設(shè)近平面左下角點(diǎn)a1的三維空間坐標(biāo)為(l,b,n),右上角點(diǎn)c1的三維空間坐標(biāo)為(r,t,n),則透視投影變換可用下列矩陣P表示:
?
?
透視投影變換實(shí)際上就是用矩陣P乘三維空間點(diǎn)的坐標(biāo)運(yùn)算。
2.3 紋理映射
紋理映射是把紋理影像“貼”到由DTM數(shù)據(jù)所構(gòu)成的三維模型上,它是建立具有真實(shí)感的三維地形地貌的重要手段。紋理映射的關(guān)鍵是實(shí)現(xiàn)影像與DTM之間的正確套合,使每個(gè)DTM網(wǎng)格點(diǎn)與其所在的影像位置一一對(duì)應(yīng),保證紋理在變換時(shí)與所附著的曲面保持適當(dāng)?shù)年P(guān)系。對(duì)于原始影像,可以根據(jù)成像時(shí)的幾何關(guān)系,利用共線方程解算出每一個(gè)DTM網(wǎng)格點(diǎn)所對(duì)應(yīng)的像坐標(biāo),將其作為紋理映射時(shí)的紋理坐標(biāo)依據(jù)。
紋理映射有二個(gè)問題需要重點(diǎn)考慮。①內(nèi)存與速度之間的矛盾。由于加入了圖像紋理,使得著色算法變得復(fù)雜化,明顯影響了三維地形的顯示速度。如果在三維地形多分辨率模型中加入多分辨率的紋理,即將圖像分成多級(jí)分辨率,然后根據(jù)視點(diǎn)的變化來選擇其中的分辨率,這就更增加了內(nèi)存與速度之間的矛盾。②大尺寸圖像的疊加問題。通常軟件系統(tǒng)(如OpenGL)只支持1024×1024的圖像尺寸。如果有一個(gè)高分辨率的圖像,圖像尺寸是4096×4096,則需要將大圖像分成較小的尺寸(如512×512),同時(shí)將地形也相應(yīng)分成較小的地形塊,將圖像塊與地形塊疊加后,再將它們拼接起來。為了防止拼接縫的產(chǎn)生,在設(shè)計(jì)分塊時(shí)讓塊與塊之間保留少量的重疊。紋理映射時(shí),OpenGL會(huì)自動(dòng)根據(jù)周圍像點(diǎn)的像素值來決定拼接處像點(diǎn)的像素值,從而避免拼接縫的產(chǎn)生。OpenGL中紋理映射的基本操作步驟如下:
(1)定義紋理。用glTexImage2D()函數(shù)說明所映射的紋理內(nèi)容,其中包括紋理數(shù)據(jù)的指針、紋理的大小、紋理的類別(灰度或色彩)等。簡(jiǎn)單的紋理是一個(gè)圖像。
(2)紋理控制。用來說明紋理以何種方式映射到三維模型表面上,OpenGL提供的函數(shù)為glTexParameter*()??梢园鸭y理作為象素的最終顏色,用紋理覆蓋原有的象素段;也可以把光照與紋理后的效果結(jié)合起來,調(diào)整或放大象素段的顏色。另外也可以用基于紋理值的一個(gè)固定顏色與象素段顏色混合。
(3)使用紋理映射。在繪制場(chǎng)景前,先調(diào)用glEnable(GL_TEXTURE_1D)或glEnable(GL_TEXTURE_2D)函數(shù),允許使用一維和二維紋理映射。在紋理映射過程中,可以用紋理來調(diào)整三維模型的顏色或?qū)⒓y理與三維模型原來的顏色進(jìn)行融合,其調(diào)整函數(shù)為glTexEnv*()。
(4)繪制場(chǎng)景。定義三維模型頂點(diǎn)的紋理坐標(biāo)與幾何坐標(biāo)。幾何坐標(biāo)決定了頂點(diǎn)在屏幕上的繪制位置,紋理坐標(biāo)決定紋理圖像中哪一個(gè)紋理單元賦予該頂點(diǎn),其調(diào)整函數(shù)為glTexCoord*()。在曲面上只繪制一份紋理圖案,則四個(gè)角坐標(biāo)分別為(0,0)、(1,0)、(0,1)、(1,1)。
需要注意的是:紋理映射只能在RGBA模式下使用,不適用于顏色索引模式。計(jì)算紋理坐標(biāo)必須準(zhǔn)確,否則將導(dǎo)致紋理變形。
3? 三維地形實(shí)時(shí)動(dòng)態(tài)顯示
三維地形僅僅靜態(tài)顯示還不夠,它需要交互式地實(shí)時(shí)動(dòng)態(tài)顯示。除了必要的硬件之外,OpenGL所特有的顯示列表和雙緩存機(jī)制也為實(shí)現(xiàn)三維景觀的實(shí)時(shí)動(dòng)態(tài)提供了有力的保證。
顯示列表是OpenGL為了提高程序的運(yùn)行效率而引入的“批處理”技術(shù),是預(yù)先存儲(chǔ)的、用于稍后執(zhí)行的一組OpenGL命令序列。激活一個(gè)顯示列表后,就可按照顯示列表中預(yù)先排好的次序執(zhí)行其存儲(chǔ)的命令。顯示列表是不可修改的,一旦建立,OpenGL就將其處理成適合于圖形硬件的格式,而且可以避免在繪圖過程中因主機(jī)計(jì)算量過大而影響圖形生成的速度,從而提高了效率。雙緩存技術(shù)提供前后二個(gè)緩存,在顯示前臺(tái)緩存內(nèi)容的一幀圖像時(shí),后臺(tái)正在繪制下一幀的圖像;后臺(tái)繪制完成后,交換前后臺(tái)緩存,不斷地循環(huán),實(shí)現(xiàn)地形的實(shí)時(shí)動(dòng)態(tài)顯示。OpenGL中雙緩存是通過調(diào)用auxSwapBuffers()函數(shù)實(shí)現(xiàn)的。
地形實(shí)時(shí)動(dòng)態(tài)顯示一般有二種方式:一種是視點(diǎn)固定、目標(biāo)移動(dòng),目標(biāo)本身的變化包括目標(biāo)的平移、旋轉(zhuǎn)和縮放等。這種顯示方式較容易實(shí)現(xiàn),而且平行投影和透視投影二種投影方式都可以采用。另一種是目標(biāo)固定、視點(diǎn)移動(dòng)。這種顯示方式實(shí)現(xiàn)起來較復(fù)雜,因?yàn)槟繕?biāo)固定、視點(diǎn)沿路徑運(yùn)動(dòng),因此必須采用透視投影才能達(dá)到仿真效果。本文中三維地形的動(dòng)態(tài)顯示即采用第二種方式。
4? 結(jié)束語(yǔ)
根據(jù)上文介紹的技術(shù),在CPU為PⅢ800、內(nèi)存為128MB、Windows2000環(huán)境下,以VC6.0為開發(fā)平臺(tái)、OpenGL為工具,進(jìn)行了水下三維地形的動(dòng)態(tài)顯示仿真。所繪制的某一水下地形顯示地形地貌效果良好。本文的研究還很基礎(chǔ),對(duì)于三維數(shù)據(jù)的采集、壓縮、插值、建模、顯示速度等方面還有許多問題有待進(jìn)一步研究。
?
參考文獻(xiàn)
1? 王永明.地形可視化.中國(guó)圖像圖形學(xué)報(bào).2000;(6)
2? 郭文普,孫繼銀.視景生成中的幾個(gè)關(guān)鍵技術(shù).系統(tǒng)仿真學(xué)報(bào),2001;(11)
3? 吳剛.ZZC02雷達(dá)裝甲車系統(tǒng)軟件的研制.成都:電子科技大學(xué)碩士學(xué)位論文,2001
4? 柴小文,王金巖,田翼.三維數(shù)字地形圖生成技術(shù)研究.航空電子技術(shù),2002;(12)
5? 戴晨光,朱述龍.利用OpenGL實(shí)現(xiàn)三維地形的快速動(dòng)態(tài)顯示.測(cè)繪通報(bào).1998;(6)
6? 高武俊,張繼賢,張永紅.基于OpenGL的三維地形可視化研究.測(cè)繪通報(bào),2002(增刊)