朱俊潔,陶偉,殷明陽
(1.四川大學計算機學院,成都610065;2.中國艦船研究設計中心,武漢430064;3.中國核動力研究設計院,成都610041)
近年來,隨著“數字地球”這一概念的提出[1],大規模地形可視化[2]在戰場仿真、戰場態勢推演、虛擬現實等諸多領域得到了廣泛的應用。數字地球在世界各地覆蓋高分辨率的遙感影像,并通過建立覆蓋全球的數字高程模型和地球景觀模型,形成虛擬地球。地形數據以數字高程模型(DEM)為基礎,實現地形的數字仿真,通過LOD 分層、四叉樹分塊全球剖分建立骨架。地形分塊的過程中,地形塊邊界頂點的法向量只通過每個地形塊含有的數據信息進行計算,所以相鄰地形塊重疊的邊界頂點的法向量不相同,導致地形瓦片邊界無法平滑過渡,從而降低了三維地形的真實感。
數字地球平臺OSGEarth 通過在地形引擎中提供normalizeEdges 的選擇,解決了地形塊邊界頂點法向量不一致的問題。為了呈現真實的地形效果,渲染過程中需要調度大量高程數據和紋理數據。在大規模地形平滑過程中,OSGEarth 地形引擎對周圍地形瓦片數據的調度次數過于頻繁,會導致地形加載緩慢,極大地影響實時繪制的速度。
本文基于數字地球平臺OSGEarth 提出了一種地形平滑過程中瓦片高程數據快速調度方法,通過對地形瓦片數據的高程值進行預處理,生成高程差值文件,從而減少了對周圍地形瓦片的調度次數,能夠有效地加快平滑地形的速度。
OpenSceneGraph(OSG)是OpenGL 開發的開源三維渲染引擎。其核心功能主要包括場景管理和圖形繪制[3]。OSG 在虛擬現實、戰場仿真、三維數據可視化等領域之中有著非常廣泛的應用。OSGEarth 是一個基于標準C++和OSG 3D 渲染引擎的開源軟件開發工具包,用于地形生成、模型數據加載和渲染。它可以從網絡或本地獲取地形數據和圖像數據,并實時優化、構建和顯示,支持多個數據源的加載和管理[4]。OSGEarth 使用一種基于XML 格式的配置管理文件,可以從系統外部讀取本地文本文件加載地球數據,開發人員可以手動配置文本文件來加載所需的數據,具有很強的靈活性。用戶添加的數據通過不同的場景層進行加載和調度,便于數據管理。OSGEarth 提供了一種數據緩存機制。OSGEarth 可以將第一次加載的數據以緩存的形式保存到本地,第二次加載時先讀取緩存的數據,提高了數據加載的效率。
OSGEarth 通過加載不同的數據源驅動程序來加載數據源的。例如,調用GDAL 驅動程序進行影像加載和DEM 數據處理;基于TMS 協議,調用TMS 服務加載瓦片數據[5];調用ArcGIS 驅動程序加載和顯示ArcGIS服務器所發布的數據。另外,OSGEarth 具有很強的可擴展性,開發人員可以基于OSGEarth 編寫所需的數據源驅動程序來加載相應的數據。
為了實現大規模地形數據的實時可視化,目前的研究熱點主要包括大規模數據塊的數據調度、網格簡化、裂縫消除和視圖裁剪,其中,細節層次模型(Level Of Detail,LOD)[6]是近年來學者們的一個重要研究方向。在海量地形和模型數據的瀏覽方案中,經常采用LOD 對其進行劃分。細節層次(LOD)是提高模型顯示速度和降低場景復雜度的有效方法。LOD 根據對象模型節點在三維環境中的位置和重要性,確定了對象繪制的資源分配,減少了非重要對象的細節,從而加快了場景的繪制。同樣,由于人眼視覺特性的影響,物體在不同位置的細節程度是完全不同的。根據人眼視覺差異的特點,LOD 技術將場景中同一物體按照不同的細節層次建立一組幾何模型[7]。在進行場景渲染的過程中,根據不同對象的位置,選擇具有相應細節級別的模型來加載場景。也就是說,當視點靠近對象時,模型的精細部分被加載到視圖中;反之,當視點遠離對象時,粗略模型部分被加載到視圖中。
數字高程模型DEM(Digital Elevation Model)[8]是一個實體地面模型,以有序值數組的形式表示地面高程。它主要是描述區域地貌形態的空間分布,通過等高線或類似的三維模型進行數據采集,然后進行數據插值形成。通過STRM(Shuttle Radar Topography Mission),即航天飛機雷達地形測繪任務會,本文獲取了格式為GeoTiff 的全球高程數據,高程數據集共3.8G。
由于高程數據量大,需要將地形數據分割成矩形塊數據,然后根據不同的級別和區域進行命名,然后存儲在相應的cache 文件夾中。每個地形瓦片數據包含17×17 個像素點,以從左往右、從上到下的順序存儲了289 個數據。在3D 環境下加載高程數據時,可以通過緩存索引文件直接加載到相應的地形瓦片數據中。這種方法可以大大提高海量高程數據的加載和瀏覽效率[10]。OSGEarth 使用動態四叉樹LOD 來組織地形高程數據。數據被分成不同層次的瓦片序列。層間數據采用四叉樹數據結構,類似于金字塔形狀。
金字塔模型如圖1 所示。
GDAL 是一個優秀的開源庫,它為讀取、寫入、轉換和處理光柵數據格式提供了標準的二次開發接口,并且是一個完全開放的源代碼,它為開發人員進行二次開發和底層功能擴展提供了一個高起點[9]。獲取到地形高程數據后,使用GDAL 柵格空間數據轉換庫讀取地形瓦片數據的高程值,并調整高程數據的存儲順序,確保高程值的存儲順序和加載瓦片數據時讀取高程值的順序相同。讀取地形瓦片數據高程值的核心代碼如下:


記需要進行平滑處理的地形塊為中心地形瓦片c,使用GDAL 讀取中心地形瓦片數據及其周圍地形瓦片數據的高程值,周圍地形瓦片數據的高程值包括和中心地形瓦片據同一LOD 下的西北方、北方、東北方、西方、東方、西南方、南方和東南方單元的地形瓦片高程值。將中心地形瓦片的西北方、北方、東北方、西方、東方、西南方、南方和東南方單元地形瓦片分別記為nw、n、ne、w、e、sw、s 和se。
每個地形瓦片數據包含17×17 個像素點,因此中心地形瓦片每條邊上有17 個邊界點。中心地形瓦片邊界點與周圍地形瓦片近邊界點的對應關系如圖2 中虛線所示。

圖2 邊界點與近邊界點對應關系示意圖
按照中心地形瓦片邊界點與周圍地形瓦片近邊界點的對應關系,計算周圍地形瓦片近邊界點和中心地形瓦片邊界點的差值。每個高程差值文件存放72 個浮點數類型的高程差值數據,共占用288 個字節。根據不同的LOD 級別和區域對高程差值文件進行命名,存儲在相對應的文件夾中。
要使光照應用到地形上,首先需要計算法線。法線是定義表面對光的反應的向量,即它是如何被照亮的。表面的光照強度與光線方向和法線之間的角度成正比。角度越小,表面看起來越亮。OpenGL 中可以定義為面法線和頂點法線。如果定義了面法線,那么法線通常被定義為正交于這個面的向量。與這個面共面的兩個向量叉乘的結果即為正交于面的法向量。另一個必要的步驟就是對向量進行歸一化,即使其成為單位長度。歸一化需要計算向量的長度,再除以每個分量的長度。
在大規模地形可視化中,每個地形分塊的法線不同,不同方向的面的亮度之間有明顯的差異,導致地形看起來不平整。為了使地形更平滑,必須計算每個頂點的法線,而不是每個面的法線。當計算一個頂點法線時,必須考慮所有共享該頂點的面。如圖3 所示,每個面的頂點(不包括角落和邊界頂點)都由四個多邊形共享。因此,這個頂點法線應為所有共享面法線的和再歸一化的結果。

圖3 中心頂點的法線與共享面關系
圖3 中,v表示中心頂點的法線。vij表示每個共享面的法線。如v12是右下方面的單位長度的法線。頂點法線v被計算作為所有vij向量歸一化后的和。
OSGEarth 在平滑地形的過程中會調度周圍瓦片的所有數據,而高程差值文件只保留了平滑地形需要的點的高程數據,能夠避免調度過多地形瓦片數據,因此能夠加速平滑過程。本文的算法首先在OSGEarth 中加載中心地形瓦片數據,中心地形瓦片記為c。通過中心地形瓦片c 的編號調度其對應的高程差值文件,讀取高程差值文件。通過高程差值和邊界點高程值求和算出c 周圍一圈點的高程值,即c 以外的西北方點、北方點、東北方點、西方點、東方點、西南方點、南方點和東南方點地形高程值。然后,通過獲取的地形高程值修改NDC 坐標(標準化設備坐標)的Z 坐標。
獲取到NDC 坐標后,需要進行坐標系轉化。首先,將NDC 坐標轉換為模型坐標。模型建立坐標系以物體的中心為坐標原點,物體的旋轉、平移等操作都在模型坐標系內進行。然后將模型坐標轉換成ECEF 坐標(地心地固坐標系),也就是OSGEarth 用于渲染圖像的坐標系。在地心坐標下,計算中心地形瓦片邊界點相關三角面片的法向量。最后,對中心地形塊邊界點上的法向量進行歸一化處理,以快速平滑地形。
為了驗證該方法能快速平滑地形,本文進行了相關實驗。實驗的硬件平臺CPU 為AMD A8-4500M APU with Radeon HD Graphics 四核,內存為8GB,顯卡型號為AMD Radeon HD 7640G,開發工具為Visual Studio 2010,該實驗渲染時的屏幕窗口大小為1024×768。測試數據為經緯度在(85.07,28.49)附近地塊。
地形渲染效果的對比如圖4a~圖3c 所示。圖4a是沒有經過平滑處理的地形場景,圖中的圓圈標明了其中的一個分界線。圖4b 是OSGEarth 所用算法平滑后的地形場景。圖4c 是本文算法平滑后的地形場景。比較而言,地形未平滑時會產生明顯的分界線,經過OSGEarth 所用算法和本文所提出的算法平滑后,分界線的問題得到了很大的改善,能夠平滑過渡,兩種算法的渲染效果并不存在明顯差異。因此,本文的算法能夠有效地解決地形渲染時出現的不平整問題。

圖4 渲染截圖
表1 給出了算法的平均耗時對比。

表1 算法的平均耗時對比
從表1 中可看出,當平滑同樣數量的地形瓦片時,本文所提出算法相比于OSGEarth 地形調度算法耗時更少,能夠快速平滑地形。
本文介紹了OSGEarth 和LOD 算法,通過對地形數據高程值預處理,基于OSGEarth 實現大規模地形下高程數據的調度。在保證渲染效果的前提下,由于減少了地形平滑過程中大量不必要的數據調度,可以達到快速平滑地形的效果。實驗結果表明,本文提出的方法與OSGEarth 平滑后的結果沒有明顯區別,但加載同樣數量的地形瓦片,能夠明顯縮短調度耗時。本文的算法能夠有效地提高地形瓦片的渲染效率,增加用戶的沉浸感。