干工程的都想知道:三維地形可視化實現技術

幹工程的都想知道:三維地形可視化實現技術

近幾年來,隨著計算機技術,特別是計算機圖形學、網絡、多媒體、三維仿真技術、虛擬現實技術的快速發展,給二維電子地圖注入了新的活力, 基於三維虛擬場景的三維電子地圖正成為電子地圖發展的一個重要方向。但是三維電子地圖的基本模型必須從三維地形模型製作出發, 三維地形模型就是把數字形式的地形數據轉換成三維仿真的地形模型,它的製作也是電子遊戲、電子沙盤和虛擬現實以及三維地理信息系統應用的基礎, 其製作的精度直接影響著整個應用的視覺效果。本文介紹在 VC++ 開發平臺上基於 OpenGL 的三維地形動態模型的建立及其應用。

OpenGL 的工作原理整個 OpenGL 的基本工作原理流程圖如圖 1 所示。

幹工程的都想知道:三維地形可視化實現技術

圖 1 OpenGL 基本工作原理流程

由於三維地形模型是三維地理信息系統(3D2GIS) 最基本的地形模型, 因此它的建立和應用是國內外地理信息系統界研究的一個熱門課題,也是多年來一直在不斷完善和更新的一個難點問題。三維地形模型是關於三維空間數據組織的概念和方法, 它反映了現實世界中仿真的地形曲面。對三維空間數據模型的認識和研究在很大程度上決定著三維 GIS 的發展和應用的成敗。很多學者為此進行了大量的探索和研究工作,然而,由於三維空間數據的龐大和複雜多樣性, 至今人們對三維數據地形模型問題還遠遠沒有達到共識。

1、用 OpenGL 建立三維地形模型

在 VC+ + 開發平臺下利用 OpenGL 圖形開發庫函數,可以利用原始的地形數據構造三維地形模型, 其原始的地形數據包括地理座標( X , Y ) 和高程值( H) 。OpenGL 共包括 100 多個功能強大的圖形函數, 開發人員可以利用這些函數來建立三維模型和進行三維實時交互。這些函數分屬於三個基本圖形庫,即基礎庫、實用庫和輔助庫。OpenGL 的基本功能包括:模型繪製、模型觀察、顏色模式的指定、光照應用、圖像效果增強、位圖及圖像處理、紋理映射、多緩存應用、實時動畫、交互技術等。

1)採集數據

首先利用二維的平面電子地圖採集生成三維地形模型所需的數據,主要包括三維地形模型所在區域離散點的平面地理座標(X , Y) 和高程值( H) ,根據坡度和地形起伏變化控制離散點的稀密狀況, 如果地形起伏比較大則數據點的採集也要相應的密度大一點,否則可以減小離散點的採集密度以減小數據量。

2) 構造三角網

計算機圖形學中的所有光滑曲面最終都是由多邊形 (主要是三角形) 無限逼近得到的,因此建立曲面模型的實質是構造用來逼近該曲面的空間三角網。利用採集到的離散點根據 Delaunay 三角網的夠網規則生成三角網。為了動態更新地形模型數據,我們將數據存放為文本文件(其後綴為. txt) ,以便隨時調用和更新。文件中的第一個整數是三角網的採樣點個數, 接下來的浮點數是採樣點的地形特徵數據,其排列方式為從左到右( Xi , Yi , Hi ) ,其間用逗號隔開,每一行的數據個數為一個。

3)利用地形數據建立地形模型

以 Visual C+ + 6. 0 為開發平臺時調用 OpenGL 庫函數一般要進行如下設置,選擇 Project 菜單下的 Setting 選項,在彈出的對話框 Link 欄的 Lib 輸入框中添加 openg132.lib ,glu32.lib 及 glaux.lib. 在程序中包含以下頭文件:

# include ”gl \ gl. h”

# include ”gl \ glu. h”

# include ”gl \ glaux. h”

並且調用以下函數進行窗口的初始化:

auxInitDisplayMode (AUX SIN GL E| AUXRGBA| AUX DEPTH) ;

//窗口顯示單緩存和 RGB(彩色) 模式

auxInit Position (0 ,0 ,500 ,500) ;

//大小 x = 500 , y = 500 (0 ,0) 是屏幕左上點

auxInitWindow(”三維地形模型”) ;

//窗口初始化,參數是標題gl ClearColor (0. 0 ,0. 0 ,0. 0 ,0. 0) ;

//將窗口清為黑色gl Clear ( GL COLOR BUFFER BIT) ;

//將顏色緩存清為 gl ClearColor 命令所設置的顏色

//即背景色調用以下函數繪製具有顏色設置的三角形並且建成三維的地形模型表面:

gl Begin ( GL TRIAN GL E) ;gl Color3f (R ,G,B) ;

//顏色設置gl Vertex3f ( x 1 , y1 , h1) ;

gl Vertex3f ( ( x2 , y2 , h2) ;

gl Vertex3f ( ( x3 , y3 , h3) ;

…gl Vertex3f ( x i , yi , hi) ;

…gl End () ;

然後可以調用下列函數對地形模型進行光照和材質的處理:

void gl Light { if } [ v ] ( GLenum light , GLenumpname ,TYPE param) ;

void gl Material {if } [ v ] ( GLenum face , GLenumpname ,TYPE param) ;

2、基於 OpenGL 的三維真實感地形的生成

用 OpenGL 生成三維真實感地形的基本過程如圖 2 所示:

幹工程的都想知道:三維地形可視化實現技術

圖 2 用 OpenGL 構造三維地形景觀流程圖

1)數據準備

用於構造三維真實感地形的數據 包 括 DEM 數 據 和 紋 理 數據。相關區域的 DEM 的獲取有實地採集法、攝影測量法、現有圖數字化法。DEM 一般採用格網點格式。DEM 數據的處理包括不同格式 DEM 間的轉化、DEM 數據簡化、格網 DEM 與 TIN 間的相互轉化等; 紋理數據的處理包括圖像格式轉化、圖像裁切等。由於OpenGL 所處理的影像紋理大小必須為 2m ×2n (m ,n 為整數) ,則必須對正射影像進行分塊或重採樣處理, 以滿足 OpenGL 紋理映射的需要。

2)設置各項基本參數

在用 OpenGL 繪製三維真實感地形模型和進行紋理映射前,需要設置相關的景觀參數值。首先應對圖形操作描述表(RendingContext ) 以及像素格式(Pixel Format) 進行創建和設置;其次對光源性質(鏡面反射光、漫射光、環境光) 、光源方位(距離和方向) 、顏色模式(索引模式或 RGBA 模式) 、明暗處理方式(平滑處理或平面處理) 、消隱模式、紋理映射方式等;也可根據相關函數設置三維真實感地形模型的顏色值和對光照的反射特性。除此之外還需設定視點位置和視線方向。這些參數設置都可以通過對 OpenGL 的相關函數的參數選擇來實現。

3)構造三維真實感地形模型

OpenGL 的基本幾何對象都是圍繞頂點來建立的, 而對頂點來說最重要的信息是由 gl Vertex3 () 命令提供的座標。值得注意的是,在 OpenGL 中幾何對象頂點的座標值、法線、紋理座標和顏色等都必須包含在 gl Begin () 和 gl End () 函數對之間,否則就不會有任何繪製出現。三維真實感地形模型的基本構造通常是以三角面為單元的。三角面的明亮程度除取決於光源和明暗處理方式外,還受到點與面的法向量的影響。一般點的法向量取值為其周圍面法向量的均值。這樣三維模型的構造可由下列程序給出:

gl Begin( GL TRIANGL E STRIP) ;

gl Normal3fv(N0) ; / / 設置頂點法向量

gl Vertex3f (v0) ; / / 設置頂點座標

gl Normal3fv(N1) ; / / 設置頂點法向量

gl Vertex3f (v1) ; / / 設置頂點座標……gl End() ;

構造模型的同時,還可以對模型進行平移、旋轉將其移至三維空間的適當位置, 通過適當的縮放使三維真實感地形與三維空間景物的比例相協調。

4)投影和視區變換

投影變換一般分為透視投影變換和正交投影變換兩類。投影方式的選擇取決於顯示的內容和用途。由於透視投影類似於人眼對客觀世界的觀察方式, 因而廣泛應用於三維地形模擬、飛行仿真、步行穿越仿真等模擬人眼視覺效果的研究領域。正交投影的物體或場景的幾何屬性不變,視點位置不影響投影的結果,如果需要觀察模型某一個側面不帶有形變的景觀, 則更多采用正交投影方式,如製作地形暈渲圖則一般採用正射投影方式。本文選擇透視投影,函數為 gluPerspective ( ) ,OpenGL 只繪製位於視景體內的對象,所以在設置 gluPer2spective 的參數時,應充分考慮地形範圍的大小以便選擇合適的視景體範圍。視區是指計算機屏幕中用來繪圖一個矩形區域,缺省的視區與窗口一樣大,它用窗口座標來度量,反映了屏幕上的像素位置。視區相對於窗口的左下角。視區變換就是將視圖體最後三維空間座標映射為計算機屏幕上的二維平面座標。視區變換用函數 gl Viewport (0 ,0 ,cx ,cy) 實現,視區的寬高比通常等於視景體的寬高比, 否則視區內顯示的圖形將會發生形變。根據視區變換後視區內每一點的 Z 座標值,OpenGL 可以自動判斷點的前後實現消隱功能, 使得靠近視點的目標能夠遮擋視區同一位置遠離視點的目標。

5)紋理映射

自然界中的物體表面很少是光滑和單調的, 往往具有各種紋理, 在計算機圖形學中是採用紋理映射的方法給計算機生成的物體圖像加上紋理的。紋理映射是建立逼真三維地形景觀的重要手段,不採用紋理映射所得到的地形模型僅僅是具有明暗效果的光照模型,光照模型可以按照高程值進行過渡著色或分層設色。它能夠直觀地反映地表起伏狀況,但不能重現地表的真實面貌。一般紋理映射的思路是把紋理圖像“貼”到由 DEM 數據所構成的三維模型上。其關鍵是實現影像與 DEM 之間的正確匹配,使每個 DEM 格網點與其所在的圖像位置一一對應。為提高紋理映射的運算效率,通常採用預處理好的與 DEM 座標相對應的圖像作為紋理以免除紋理座標的計算。用 OpenGL 函數進行紋理映射的基本步驟為:①紋理定義: OpenGL 要求紋理圖像的尺寸必須是 2 的冪,且不能大於 1024 字節。用 gl TexIm2age2D() 函數說明所映射的紋理內容。其中包括紋理數據的指針、紋理的大小、紋理的類別(灰度或彩色) 等。如果沒有原地形的正射影像,用戶也可根據地形特點設計自己的紋理圖像。②紋理控制: 說明紋理以何種方式映射到三維模型表面上。OpenGL 提供了多種映射方式, 其中包括紋理濾波、重複與伸縮,其函數為 gl TexPa2rameterf () 。③紋理映射方式說明:在紋理映射過程中,可以用紋理來調整三維模型的顏色或者將紋理與三維模型原來的顏色進行融合,其調用函數為 gl Tex2Envf () 。④啟動關閉紋理映射: 在繪製某一個場景前必須調用 gl En-able ( GL TEXTURE 2D) 來啟動紋理映射,結束時調用 gl Disable (GL TEXTURE2D) 。⑤三維地形模型頂點的紋理座標與幾何座標定義及場景繪製:幾何座標決定了頂點在屏幕上的繪製位置,其調用函數為 gl Vertex 3 ( ) ;紋理座標決定紋理圖像中哪一個紋理單元賦予該頂點,其調用函數為 gl TexCoord 3 () ,幾何座標和紋理座標必須匹配。

6)三維地形交互式動態顯示

按照人們的視覺習慣,總是希望在原點(或其他方便位置) 處構造所需畫面,然後從一個較佳的位置觀看該畫面。OpenGL 自帶的實用庫函數 gluLookAt ( ) 正是為這個目的而設計的,故可以採用此庫函數來實現虛擬場景的觀察變換。glu2LookAt () 庫函數的原型如下:

void gluLookAt ( GLdouble eyex , GLdouble eyey ,GLdoubleeyez , GLdouble centerx , Gldouble centery , GLdou2ble centerz ,GLdouble upx , GLdouble upy , GLdouble upz)其中: 前三個參數 eyex、eyxy、eyez 指定視點(眼睛) 的 位 置;中間三個 centerx ,centery ,centerz 指定沿著所需視線上的任一點(參考點) 的位置;upx ,upy ,upz 指定向上的矢量方向(觀察向量) 。地形透視圖形成後, 可為應用程序加入鼠標和鍵盤的消息響應函數,並將視點、視角、模型旋轉角度等設為變量作為消息響應函數中的控制參數,從而可以交互式地從不同角度觀察三維地形,來實現三維真實感地形場景的漫遊效果。

隨著計算機及圖形處理設備性能的不斷提高, 地形三維可視化技術正向著實時動態顯示、交互式控制、具有高度真實感的場景畫面顯示方向發展, 利用 OPENGL 強大的圖形功能,可以輕鬆地實現逼真的動態地形圖。在此基礎上,運用 VisualC++的 MFC 應用程序模式, 可對 OPENGL 產生的模型進行更進一步的控制和變化。試驗結果說明利用 VC++6.0 和 OpenGL 作為開發工具來進行三維地形圖的開發非常方便快捷, 是一條切實有效的途徑。


分享到:


相關文章: