朱俊潔,陶偉,殷明陽(yáng)
(1.四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065;2.中國(guó)艦船研究設(shè)計(jì)中心,武漢430064;3.中國(guó)核動(dòng)力研究設(shè)計(jì)院,成都610041)
近年來(lái),隨著“數(shù)字地球”這一概念的提出[1],大規(guī)模地形可視化[2]在戰(zhàn)場(chǎng)仿真、戰(zhàn)場(chǎng)態(tài)勢(shì)推演、虛擬現(xiàn)實(shí)等諸多領(lǐng)域得到了廣泛的應(yīng)用。數(shù)字地球在世界各地覆蓋高分辨率的遙感影像,并通過(guò)建立覆蓋全球的數(shù)字高程模型和地球景觀模型,形成虛擬地球。地形數(shù)據(jù)以數(shù)字高程模型(DEM)為基礎(chǔ),實(shí)現(xiàn)地形的數(shù)字仿真,通過(guò)LOD 分層、四叉樹(shù)分塊全球剖分建立骨架。地形分塊的過(guò)程中,地形塊邊界頂點(diǎn)的法向量只通過(guò)每個(gè)地形塊含有的數(shù)據(jù)信息進(jìn)行計(jì)算,所以相鄰地形塊重疊的邊界頂點(diǎn)的法向量不相同,導(dǎo)致地形瓦片邊界無(wú)法平滑過(guò)渡,從而降低了三維地形的真實(shí)感。
數(shù)字地球平臺(tái)OSGEarth 通過(guò)在地形引擎中提供normalizeEdges 的選擇,解決了地形塊邊界頂點(diǎn)法向量不一致的問(wèn)題。為了呈現(xiàn)真實(shí)的地形效果,渲染過(guò)程中需要調(diào)度大量高程數(shù)據(jù)和紋理數(shù)據(jù)。在大規(guī)模地形平滑過(guò)程中,OSGEarth 地形引擎對(duì)周?chē)匦瓮咂瑪?shù)據(jù)的調(diào)度次數(shù)過(guò)于頻繁,會(huì)導(dǎo)致地形加載緩慢,極大地影響實(shí)時(shí)繪制的速度。
本文基于數(shù)字地球平臺(tái)OSGEarth 提出了一種地形平滑過(guò)程中瓦片高程數(shù)據(jù)快速調(diào)度方法,通過(guò)對(duì)地形瓦片數(shù)據(jù)的高程值進(jìn)行預(yù)處理,生成高程差值文件,從而減少了對(duì)周?chē)匦瓮咂恼{(diào)度次數(shù),能夠有效地加快平滑地形的速度。
OpenSceneGraph(OSG)是OpenGL 開(kāi)發(fā)的開(kāi)源三維渲染引擎。其核心功能主要包括場(chǎng)景管理和圖形繪制[3]。OSG 在虛擬現(xiàn)實(shí)、戰(zhàn)場(chǎng)仿真、三維數(shù)據(jù)可視化等領(lǐng)域之中有著非常廣泛的應(yīng)用。OSGEarth 是一個(gè)基于標(biāo)準(zhǔn)C++和OSG 3D 渲染引擎的開(kāi)源軟件開(kāi)發(fā)工具包,用于地形生成、模型數(shù)據(jù)加載和渲染。它可以從網(wǎng)絡(luò)或本地獲取地形數(shù)據(jù)和圖像數(shù)據(jù),并實(shí)時(shí)優(yōu)化、構(gòu)建和顯示,支持多個(gè)數(shù)據(jù)源的加載和管理[4]。OSGEarth 使用一種基于XML 格式的配置管理文件,可以從系統(tǒng)外部讀取本地文本文件加載地球數(shù)據(jù),開(kāi)發(fā)人員可以手動(dòng)配置文本文件來(lái)加載所需的數(shù)據(jù),具有很強(qiáng)的靈活性。用戶添加的數(shù)據(jù)通過(guò)不同的場(chǎng)景層進(jìn)行加載和調(diào)度,便于數(shù)據(jù)管理。OSGEarth 提供了一種數(shù)據(jù)緩存機(jī)制。OSGEarth 可以將第一次加載的數(shù)據(jù)以緩存的形式保存到本地,第二次加載時(shí)先讀取緩存的數(shù)據(jù),提高了數(shù)據(jù)加載的效率。
OSGEarth 通過(guò)加載不同的數(shù)據(jù)源驅(qū)動(dòng)程序來(lái)加載數(shù)據(jù)源的。例如,調(diào)用GDAL 驅(qū)動(dòng)程序進(jìn)行影像加載和DEM 數(shù)據(jù)處理;基于TMS 協(xié)議,調(diào)用TMS 服務(wù)加載瓦片數(shù)據(jù)[5];調(diào)用ArcGIS 驅(qū)動(dòng)程序加載和顯示ArcGIS服務(wù)器所發(fā)布的數(shù)據(jù)。另外,OSGEarth 具有很強(qiáng)的可擴(kuò)展性,開(kāi)發(fā)人員可以基于OSGEarth 編寫(xiě)所需的數(shù)據(jù)源驅(qū)動(dòng)程序來(lái)加載相應(yīng)的數(shù)據(jù)。
為了實(shí)現(xiàn)大規(guī)模地形數(shù)據(jù)的實(shí)時(shí)可視化,目前的研究熱點(diǎn)主要包括大規(guī)模數(shù)據(jù)塊的數(shù)據(jù)調(diào)度、網(wǎng)格簡(jiǎn)化、裂縫消除和視圖裁剪,其中,細(xì)節(jié)層次模型(Level Of Detail,LOD)[6]是近年來(lái)學(xué)者們的一個(gè)重要研究方向。在海量地形和模型數(shù)據(jù)的瀏覽方案中,經(jīng)常采用LOD 對(duì)其進(jìn)行劃分。細(xì)節(jié)層次(LOD)是提高模型顯示速度和降低場(chǎng)景復(fù)雜度的有效方法。LOD 根據(jù)對(duì)象模型節(jié)點(diǎn)在三維環(huán)境中的位置和重要性,確定了對(duì)象繪制的資源分配,減少了非重要對(duì)象的細(xì)節(jié),從而加快了場(chǎng)景的繪制。同樣,由于人眼視覺(jué)特性的影響,物體在不同位置的細(xì)節(jié)程度是完全不同的。根據(jù)人眼視覺(jué)差異的特點(diǎn),LOD 技術(shù)將場(chǎng)景中同一物體按照不同的細(xì)節(jié)層次建立一組幾何模型[7]。在進(jìn)行場(chǎng)景渲染的過(guò)程中,根據(jù)不同對(duì)象的位置,選擇具有相應(yīng)細(xì)節(jié)級(jí)別的模型來(lái)加載場(chǎng)景。也就是說(shuō),當(dāng)視點(diǎn)靠近對(duì)象時(shí),模型的精細(xì)部分被加載到視圖中;反之,當(dāng)視點(diǎn)遠(yuǎn)離對(duì)象時(shí),粗略模型部分被加載到視圖中。
數(shù)字高程模型DEM(Digital Elevation Model)[8]是一個(gè)實(shí)體地面模型,以有序值數(shù)組的形式表示地面高程。它主要是描述區(qū)域地貌形態(tài)的空間分布,通過(guò)等高線或類似的三維模型進(jìn)行數(shù)據(jù)采集,然后進(jìn)行數(shù)據(jù)插值形成。通過(guò)STRM(Shuttle Radar Topography Mission),即航天飛機(jī)雷達(dá)地形測(cè)繪任務(wù)會(huì),本文獲取了格式為GeoTiff 的全球高程數(shù)據(jù),高程數(shù)據(jù)集共3.8G。
由于高程數(shù)據(jù)量大,需要將地形數(shù)據(jù)分割成矩形塊數(shù)據(jù),然后根據(jù)不同的級(jí)別和區(qū)域進(jìn)行命名,然后存儲(chǔ)在相應(yīng)的cache 文件夾中。每個(gè)地形瓦片數(shù)據(jù)包含17×17 個(gè)像素點(diǎn),以從左往右、從上到下的順序存儲(chǔ)了289 個(gè)數(shù)據(jù)。在3D 環(huán)境下加載高程數(shù)據(jù)時(shí),可以通過(guò)緩存索引文件直接加載到相應(yīng)的地形瓦片數(shù)據(jù)中。這種方法可以大大提高海量高程數(shù)據(jù)的加載和瀏覽效率[10]。OSGEarth 使用動(dòng)態(tài)四叉樹(shù)LOD 來(lái)組織地形高程數(shù)據(jù)。數(shù)據(jù)被分成不同層次的瓦片序列。層間數(shù)據(jù)采用四叉樹(shù)數(shù)據(jù)結(jié)構(gòu),類似于金字塔形狀。
金字塔模型如圖1 所示。
GDAL 是一個(gè)優(yōu)秀的開(kāi)源庫(kù),它為讀取、寫(xiě)入、轉(zhuǎn)換和處理光柵數(shù)據(jù)格式提供了標(biāo)準(zhǔn)的二次開(kāi)發(fā)接口,并且是一個(gè)完全開(kāi)放的源代碼,它為開(kāi)發(fā)人員進(jìn)行二次開(kāi)發(fā)和底層功能擴(kuò)展提供了一個(gè)高起點(diǎn)[9]。獲取到地形高程數(shù)據(jù)后,使用GDAL 柵格空間數(shù)據(jù)轉(zhuǎn)換庫(kù)讀取地形瓦片數(shù)據(jù)的高程值,并調(diào)整高程數(shù)據(jù)的存儲(chǔ)順序,確保高程值的存儲(chǔ)順序和加載瓦片數(shù)據(jù)時(shí)讀取高程值的順序相同。讀取地形瓦片數(shù)據(jù)高程值的核心代碼如下:
記需要進(jìn)行平滑處理的地形塊為中心地形瓦片c,使用GDAL 讀取中心地形瓦片數(shù)據(jù)及其周?chē)匦瓮咂瑪?shù)據(jù)的高程值,周?chē)匦瓮咂瑪?shù)據(jù)的高程值包括和中心地形瓦片據(jù)同一LOD 下的西北方、北方、東北方、西方、東方、西南方、南方和東南方單元的地形瓦片高程值。將中心地形瓦片的西北方、北方、東北方、西方、東方、西南方、南方和東南方單元地形瓦片分別記為nw、n、ne、w、e、sw、s 和se。
每個(gè)地形瓦片數(shù)據(jù)包含17×17 個(gè)像素點(diǎn),因此中心地形瓦片每條邊上有17 個(gè)邊界點(diǎn)。中心地形瓦片邊界點(diǎn)與周?chē)匦瓮咂吔琰c(diǎn)的對(duì)應(yīng)關(guān)系如圖2 中虛線所示。
圖2 邊界點(diǎn)與近邊界點(diǎn)對(duì)應(yīng)關(guān)系示意圖
按照中心地形瓦片邊界點(diǎn)與周?chē)匦瓮咂吔琰c(diǎn)的對(duì)應(yīng)關(guān)系,計(jì)算周?chē)匦瓮咂吔琰c(diǎn)和中心地形瓦片邊界點(diǎn)的差值。每個(gè)高程差值文件存放72 個(gè)浮點(diǎn)數(shù)類型的高程差值數(shù)據(jù),共占用288 個(gè)字節(jié)。根據(jù)不同的LOD 級(jí)別和區(qū)域?qū)Ω叱滩钪滴募M(jìn)行命名,存儲(chǔ)在相對(duì)應(yīng)的文件夾中。
要使光照應(yīng)用到地形上,首先需要計(jì)算法線。法線是定義表面對(duì)光的反應(yīng)的向量,即它是如何被照亮的。表面的光照強(qiáng)度與光線方向和法線之間的角度成正比。角度越小,表面看起來(lái)越亮。OpenGL 中可以定義為面法線和頂點(diǎn)法線。如果定義了面法線,那么法線通常被定義為正交于這個(gè)面的向量。與這個(gè)面共面的兩個(gè)向量叉乘的結(jié)果即為正交于面的法向量。另一個(gè)必要的步驟就是對(duì)向量進(jìn)行歸一化,即使其成為單位長(zhǎng)度。歸一化需要計(jì)算向量的長(zhǎng)度,再除以每個(gè)分量的長(zhǎng)度。
在大規(guī)模地形可視化中,每個(gè)地形分塊的法線不同,不同方向的面的亮度之間有明顯的差異,導(dǎo)致地形看起來(lái)不平整。為了使地形更平滑,必須計(jì)算每個(gè)頂點(diǎn)的法線,而不是每個(gè)面的法線。當(dāng)計(jì)算一個(gè)頂點(diǎn)法線時(shí),必須考慮所有共享該頂點(diǎn)的面。如圖3 所示,每個(gè)面的頂點(diǎn)(不包括角落和邊界頂點(diǎn))都由四個(gè)多邊形共享。因此,這個(gè)頂點(diǎn)法線應(yīng)為所有共享面法線的和再歸一化的結(jié)果。
圖3 中心頂點(diǎn)的法線與共享面關(guān)系
圖3 中,v表示中心頂點(diǎn)的法線。vij表示每個(gè)共享面的法線。如v12是右下方面的單位長(zhǎng)度的法線。頂點(diǎn)法線v被計(jì)算作為所有vij向量歸一化后的和。
OSGEarth 在平滑地形的過(guò)程中會(huì)調(diào)度周?chē)咂乃袛?shù)據(jù),而高程差值文件只保留了平滑地形需要的點(diǎn)的高程數(shù)據(jù),能夠避免調(diào)度過(guò)多地形瓦片數(shù)據(jù),因此能夠加速平滑過(guò)程。本文的算法首先在OSGEarth 中加載中心地形瓦片數(shù)據(jù),中心地形瓦片記為c。通過(guò)中心地形瓦片c 的編號(hào)調(diào)度其對(duì)應(yīng)的高程差值文件,讀取高程差值文件。通過(guò)高程差值和邊界點(diǎn)高程值求和算出c 周?chē)蝗c(diǎn)的高程值,即c 以外的西北方點(diǎn)、北方點(diǎn)、東北方點(diǎn)、西方點(diǎn)、東方點(diǎn)、西南方點(diǎn)、南方點(diǎn)和東南方點(diǎn)地形高程值。然后,通過(guò)獲取的地形高程值修改NDC 坐標(biāo)(標(biāo)準(zhǔn)化設(shè)備坐標(biāo))的Z 坐標(biāo)。
獲取到NDC 坐標(biāo)后,需要進(jìn)行坐標(biāo)系轉(zhuǎn)化。首先,將NDC 坐標(biāo)轉(zhuǎn)換為模型坐標(biāo)。模型建立坐標(biāo)系以物體的中心為坐標(biāo)原點(diǎn),物體的旋轉(zhuǎn)、平移等操作都在模型坐標(biāo)系內(nèi)進(jìn)行。然后將模型坐標(biāo)轉(zhuǎn)換成ECEF 坐標(biāo)(地心地固坐標(biāo)系),也就是OSGEarth 用于渲染圖像的坐標(biāo)系。在地心坐標(biāo)下,計(jì)算中心地形瓦片邊界點(diǎn)相關(guān)三角面片的法向量。最后,對(duì)中心地形塊邊界點(diǎn)上的法向量進(jìn)行歸一化處理,以快速平滑地形。
為了驗(yàn)證該方法能快速平滑地形,本文進(jìn)行了相關(guān)實(shí)驗(yàn)。實(shí)驗(yàn)的硬件平臺(tái)CPU 為AMD A8-4500M APU with Radeon HD Graphics 四核,內(nèi)存為8GB,顯卡型號(hào)為AMD Radeon HD 7640G,開(kāi)發(fā)工具為Visual Studio 2010,該實(shí)驗(yàn)渲染時(shí)的屏幕窗口大小為1024×768。測(cè)試數(shù)據(jù)為經(jīng)緯度在(85.07,28.49)附近地塊。
地形渲染效果的對(duì)比如圖4a~圖3c 所示。圖4a是沒(méi)有經(jīng)過(guò)平滑處理的地形場(chǎng)景,圖中的圓圈標(biāo)明了其中的一個(gè)分界線。圖4b 是OSGEarth 所用算法平滑后的地形場(chǎng)景。圖4c 是本文算法平滑后的地形場(chǎng)景。比較而言,地形未平滑時(shí)會(huì)產(chǎn)生明顯的分界線,經(jīng)過(guò)OSGEarth 所用算法和本文所提出的算法平滑后,分界線的問(wèn)題得到了很大的改善,能夠平滑過(guò)渡,兩種算法的渲染效果并不存在明顯差異。因此,本文的算法能夠有效地解決地形渲染時(shí)出現(xiàn)的不平整問(wèn)題。
圖4 渲染截圖
表1 給出了算法的平均耗時(shí)對(duì)比。
表1 算法的平均耗時(shí)對(duì)比
從表1 中可看出,當(dāng)平滑同樣數(shù)量的地形瓦片時(shí),本文所提出算法相比于OSGEarth 地形調(diào)度算法耗時(shí)更少,能夠快速平滑地形。
本文介紹了OSGEarth 和LOD 算法,通過(guò)對(duì)地形數(shù)據(jù)高程值預(yù)處理,基于OSGEarth 實(shí)現(xiàn)大規(guī)模地形下高程數(shù)據(jù)的調(diào)度。在保證渲染效果的前提下,由于減少了地形平滑過(guò)程中大量不必要的數(shù)據(jù)調(diào)度,可以達(dá)到快速平滑地形的效果。實(shí)驗(yàn)結(jié)果表明,本文提出的方法與OSGEarth 平滑后的結(jié)果沒(méi)有明顯區(qū)別,但加載同樣數(shù)量的地形瓦片,能夠明顯縮短調(diào)度耗時(shí)。本文的算法能夠有效地提高地形瓦片的渲染效率,增加用戶的沉浸感。