孟天杭
(北京建筑大學測繪與城市空間信息學院,北京100000)
隨著智慧城市的提出,對三維地理信息系統的需求有了迅速且實質性的進展。無人機、三維激光掃描儀技術的發展,三維空間數據獲取的時間周期與獲取成本大大縮減,由于獲取的數據更全面更精細,伴隨而來的是數據量的增加帶來的一系列問題,包括數據的管理、數據的篩選、數據的更新等眾多問題[1]。
隨著互聯網的不斷發展以及需求更加廣泛,三維GIS 可視化平臺WebGIS 應運而生,WebGIS 大大降低了系統的成本,用戶的操作也變得更簡單與高效,這就進一步促進了WebGIS 技術的大眾化發展[2]。Cesium 是一種表達地理數據的三維WebGIS可視化平臺。它的優點是具有多維的空間尺度和友好直觀的三維可視化效果,適合向不同專業程度的人群展示和分發地理數據。3D Tiles 是一個開放規范,可用于在臺式機、Web 程序和移動應用程序之間共享,可視化,可以包含多種類型的3D 地理空間內容,比如傾斜攝影測量模型、BIM建筑模型、人工模型、點云、矢量數據等都可以轉化為三維瓦片,從而高效地進行可視化、共享和互操作等難題[3]。
Cesium 在進行三維瓦片可視化過程中,它是通過相機來決定那些瓦片是當前視點情況下是可見的,對于可見的瓦片則請求瓦片數據,對于不可見的要素直接在此步驟剔除。
在可視化過程中,因為在三維瓦片的索引文件中有每個瓦片的包圍體信息,我們在解析索引文件的時候計算了每個瓦片的包圍體信息,并用一個3dTile 類來管理。對于三維空間數據我們在繪制時通過AABB 包圍盒來近似其空間范圍,以此包圍體來與相機的視景體求交來分析視景體裁剪過程[4]。

圖1 視景體裁剪示意圖
如圖1 所示,視景體是由六個面組成的,分別用六個平面方程來表示,通過六個表面組成了在可視化場景的可視區域。 1代表進裁剪平面、3 代表遠裁剪平面,2 4 與視景體相交或部分相交,5 在視景體外面。瓦片的可見與不可見是通過瓦片的包圍盒與視景體求交來判斷的,Cesium 通過三個變量表示裁剪結果。MASK_INSIDE:表示瓦片在視景體里面、MASK_OUTSIDE:表示瓦片不在視景體里面、MASK_INDETERMINATE: 表示瓦片部分在視景體里面。

圖2 可見性判斷流程圖
如圖2 所示在進行瓦片的可見性判斷時:
a.遍歷索引文件獲取每個瓦片的外包圍體信息、旋轉矩陣、幾何誤差、精化方式等信息。并將這些信息構成Cesium3DTile類 , 包 含 transform、computedTransform、boundingVolume、viewerRequestVolume、geometricError 等信息。
b.判斷當前節點是否有父級旋轉矩陣parentTransform,如果有父級就用父級旋轉矩陣,如果沒有就用索引文件中的旋轉矩陣。
c.判斷是否有父級的parentVisibilityPlaneMask 信息,如果有就用父級的可見性平面,從而提高瓦片可見性判斷的速度,如果沒有則利用裁剪平面去計算此值。
d.更新旋轉矩陣transform,用于包圍體邊界的計算。
e. 計算相機到瓦片包圍盒最近的距離distanceToCamera 與相機到瓦片中心的距離centerZDepth,用來后面屏幕空間誤差的計算。
f.計算屏幕空間誤差,并根據c 和e 計算的值進行瓦片的可見性判斷過程。
當相機視點遠離時,對場景要素的精細程度要求較低,即所需數據的LOD 級別較低。當相機視點拉進時,對場景要素的精細程度要求較高,所需數據的LOD 級別較高。如何去判斷當前瓦片的細節層次是否滿足當前視點下的要求,Cesium 使用像素誤差來決定瓦片的細節層次,也就是屏幕空間誤差SSE。

式中SSE 表示計算得到的屏幕空間誤差;geometricError 表示瓦片的幾何誤差;height 是當前畫布的像素高度;distance 表示相機到瓦片中心的距離;seeDenominator 表示2 倍的tan(fov/2)值[5]。

圖3 LOD 調度流程圖
如圖3 所示在LOD 級別跳躍過程中:
a.判斷根節點是否滿足SSE 要求,如果根節點不滿足要求整個樹不會被渲染。
b.判斷tileset 是否定義skipLevelOfDetail,如果沒有則執行基礎遍歷,獲取基礎屏幕空間誤差與最大屏幕空間誤差,如果有則執行跳躍遍歷。
c.基礎遍歷是一個深度優先遍歷過程,遍歷所有可見的瓦片并標記。如果skipLevelOfDetail 處于禁用狀態,則直到所有子瓦片都加載后,瓦片才會進行refine 操作,這個是傳統的替換求精方法,稱為基遍歷。屏幕空間誤差大于基本屏幕空間誤差的瓦片進行基本遍歷,所有其他瓦片都跳過遍歷。
d.跳躍遍歷過程,遍歷樹并檢查其選定的幀是否為當前幀,如果是將其添加到選擇文件中排隊。這是一個前序遍歷過程,因此子節點優先于父節點被選中,這樣可以很容易地標記出它們的選擇深度。
e.遍歷完之后對滿足要求的文件請求文件、渲染解析。
根據以上步驟判斷瓦片是否滿足當前視點要求下的LOD渲染策略,如果滿足則進行請求文件、解析渲染文件如果不滿足則用該節點的子節點去重新判斷是否滿足當前視點要求的渲染策略,這樣實現了動態去調度不同lod 級別的數據。
3D Tiles 三維空間數據格式包含一個json 索引文件,索引文件中包含了每個瓦片的幾何誤差、包圍體信息、瓦片數據的引用路徑、父子節點關系等。索引文件包含了整個三維瓦片的所有節點信息,由這些節點構成一個多叉樹。在Cesium 中通過Cesium3DTile 類管理,通過廣度優先遍歷索引文件,形成節點樹用于后面的一系列操作[6]。三維瓦片的調度過程如圖4 所示。

圖4 瓦片調度過程圖
如圖4 所示,在三維可視化過程中對三維瓦片調度時:
a. 首先定義一個Cesium3DTileset 類來管理三維瓦片數據。包括了索引文件的解析、節點樹的構建等。
b.解析三維瓦片數據的索引文件,通過廣度優先的方式遍歷整個索引文件,從而得到三維瓦片數據的樹狀結構。其中樹狀結構每個節點包含了一個瓦片的幾何誤差、包圍體信息、旋轉矩陣、子節點等信息,具體含義如下:
1 子節點屬性:表示當前瓦片的所有子瓦片。
2 旋轉矩陣:表示當前瓦片的旋轉矩陣,旋轉矩陣是具有級聯關系的,當前瓦片的位置是由其父節點的旋轉矩陣乘以當前節點的旋轉矩陣計算得來的。
3 包圍體屬性:表示當前瓦片所包含的三維空間數據大的包圍體信息,有三種表示方法:地理范圍、AABB 包圍盒、包圍球三種方式。
4 幾何誤差屬性:表示瓦片所包含三維空間數據的分辨率信息。用來計算瓦片的空間屏幕誤差,即瓦片的LOD 級別,便于在三維可視化時進行判斷。
c.根據相機的視點和視景體對樹結構的根節點進行裁剪測試,如果根節點對象可見或者部分可見,根據屏幕空間誤差因子判斷多細節層次是否滿足當前視點下的要求,如果滿足則進行d,如果不滿足則對子節點進行c,如果當前節點對象不可見則直接剔除。
d.對通過瓦片的可見性判斷并且滿足當前視點下的允許的最大屏幕空間誤差條件,請求三維瓦片數據,通過requestTiles、requestContent、updateTiles 等操作請求瓦片數據,并根據瓦片的具體格式采用不同的解析方法來進行解析渲染工作。若該瓦片請求成功則將該瓦片的contentUnloaded 屬性設置為false,避免重復請求。
e.瓦片更新是根據索引文件中的refine 屬性來進行瓦片的更新替換過程。它有兩種方式add 和replace。add 就是把請求完成的節點對象解析渲染加入到當前場景中。replace 是當前的節點對象的多細節層次不能滿足要求,則用其滿足要求的子孫節點瓦片進行替換。
此平臺以B/S 模式的三維WebGIS 框架為基礎,結合WebGL 圖形硬件加速渲染技術,依托Cesium 平臺,設計和實現基于Cesium 的三維虛擬地球可視化系統。系統采用前后端分離的方式進行開發,前端采用Vue 框架進行模塊化設計、后端采用Nodejs 框架進行數據的發布以及整個平臺的發布、數據庫采用MySql 來存儲三維地理要素的屬性信息,如圖5 所示。系統集成了三維場景繪制、三維漫游、三維測量、屬性信息查詢等功能。

圖5 系統總體架構圖
本文基于WebGL 渲染管線,通過視場裁剪算法、LOD 調度策略優化,解決Cesium 場景中要素可見性判斷問題,通過剔除場景中不可見要素,降低Cesium 的渲染工作量,減輕瀏覽器的工作負擔。在此基礎上,結合三維瓦片的數據結構利用多叉樹的數據調度算法,解決海量數據的按需傳輸加載問題,實現快速移動的場景中三維空間數據的流暢渲染。采用前后端技術并結合MySQL 數據庫,形成了一套可進行查詢、分析、管理等的三維WebGIS 平臺。