孟天杭
(北京建筑大學(xué)測(cè)繪與城市空間信息學(xué)院,北京100000)
隨著智慧城市的提出,對(duì)三維地理信息系統(tǒng)的需求有了迅速且實(shí)質(zhì)性的進(jìn)展。無(wú)人機(jī)、三維激光掃描儀技術(shù)的發(fā)展,三維空間數(shù)據(jù)獲取的時(shí)間周期與獲取成本大大縮減,由于獲取的數(shù)據(jù)更全面更精細(xì),伴隨而來(lái)的是數(shù)據(jù)量的增加帶來(lái)的一系列問(wèn)題,包括數(shù)據(jù)的管理、數(shù)據(jù)的篩選、數(shù)據(jù)的更新等眾多問(wèn)題[1]。
隨著互聯(lián)網(wǎng)的不斷發(fā)展以及需求更加廣泛,三維GIS 可視化平臺(tái)WebGIS 應(yīng)運(yùn)而生,WebGIS 大大降低了系統(tǒng)的成本,用戶的操作也變得更簡(jiǎn)單與高效,這就進(jìn)一步促進(jìn)了WebGIS 技術(shù)的大眾化發(fā)展[2]。Cesium 是一種表達(dá)地理數(shù)據(jù)的三維WebGIS可視化平臺(tái)。它的優(yōu)點(diǎn)是具有多維的空間尺度和友好直觀的三維可視化效果,適合向不同專業(yè)程度的人群展示和分發(fā)地理數(shù)據(jù)。3D Tiles 是一個(gè)開放規(guī)范,可用于在臺(tái)式機(jī)、Web 程序和移動(dòng)應(yīng)用程序之間共享,可視化,可以包含多種類型的3D 地理空間內(nèi)容,比如傾斜攝影測(cè)量模型、BIM建筑模型、人工模型、點(diǎn)云、矢量數(shù)據(jù)等都可以轉(zhuǎn)化為三維瓦片,從而高效地進(jìn)行可視化、共享和互操作等難題[3]。
Cesium 在進(jìn)行三維瓦片可視化過(guò)程中,它是通過(guò)相機(jī)來(lái)決定那些瓦片是當(dāng)前視點(diǎn)情況下是可見的,對(duì)于可見的瓦片則請(qǐng)求瓦片數(shù)據(jù),對(duì)于不可見的要素直接在此步驟剔除。
在可視化過(guò)程中,因?yàn)樵谌S瓦片的索引文件中有每個(gè)瓦片的包圍體信息,我們?cè)诮馕鏊饕募臅r(shí)候計(jì)算了每個(gè)瓦片的包圍體信息,并用一個(gè)3dTile 類來(lái)管理。對(duì)于三維空間數(shù)據(jù)我們?cè)诶L制時(shí)通過(guò)AABB 包圍盒來(lái)近似其空間范圍,以此包圍體來(lái)與相機(jī)的視景體求交來(lái)分析視景體裁剪過(guò)程[4]。
圖1 視景體裁剪示意圖
如圖1 所示,視景體是由六個(gè)面組成的,分別用六個(gè)平面方程來(lái)表示,通過(guò)六個(gè)表面組成了在可視化場(chǎng)景的可視區(qū)域。 1代表進(jìn)裁剪平面、3 代表遠(yuǎn)裁剪平面,2 4 與視景體相交或部分相交,5 在視景體外面。瓦片的可見與不可見是通過(guò)瓦片的包圍盒與視景體求交來(lái)判斷的,Cesium 通過(guò)三個(gè)變量表示裁剪結(jié)果。MASK_INSIDE:表示瓦片在視景體里面、MASK_OUTSIDE:表示瓦片不在視景體里面、MASK_INDETERMINATE: 表示瓦片部分在視景體里面。
圖2 可見性判斷流程圖
如圖2 所示在進(jìn)行瓦片的可見性判斷時(shí):
a.遍歷索引文件獲取每個(gè)瓦片的外包圍體信息、旋轉(zhuǎn)矩陣、幾何誤差、精化方式等信息。并將這些信息構(gòu)成Cesium3DTile類 , 包 含 transform、computedTransform、boundingVolume、viewerRequestVolume、geometricError 等信息。
b.判斷當(dāng)前節(jié)點(diǎn)是否有父級(jí)旋轉(zhuǎn)矩陣parentTransform,如果有父級(jí)就用父級(jí)旋轉(zhuǎn)矩陣,如果沒(méi)有就用索引文件中的旋轉(zhuǎn)矩陣。
c.判斷是否有父級(jí)的parentVisibilityPlaneMask 信息,如果有就用父級(jí)的可見性平面,從而提高瓦片可見性判斷的速度,如果沒(méi)有則利用裁剪平面去計(jì)算此值。
d.更新旋轉(zhuǎn)矩陣transform,用于包圍體邊界的計(jì)算。
e. 計(jì)算相機(jī)到瓦片包圍盒最近的距離distanceToCamera 與相機(jī)到瓦片中心的距離centerZDepth,用來(lái)后面屏幕空間誤差的計(jì)算。
f.計(jì)算屏幕空間誤差,并根據(jù)c 和e 計(jì)算的值進(jìn)行瓦片的可見性判斷過(guò)程。
當(dāng)相機(jī)視點(diǎn)遠(yuǎn)離時(shí),對(duì)場(chǎng)景要素的精細(xì)程度要求較低,即所需數(shù)據(jù)的LOD 級(jí)別較低。當(dāng)相機(jī)視點(diǎn)拉進(jìn)時(shí),對(duì)場(chǎng)景要素的精細(xì)程度要求較高,所需數(shù)據(jù)的LOD 級(jí)別較高。如何去判斷當(dāng)前瓦片的細(xì)節(jié)層次是否滿足當(dāng)前視點(diǎn)下的要求,Cesium 使用像素誤差來(lái)決定瓦片的細(xì)節(jié)層次,也就是屏幕空間誤差SSE。
式中SSE 表示計(jì)算得到的屏幕空間誤差;geometricError 表示瓦片的幾何誤差;height 是當(dāng)前畫布的像素高度;distance 表示相機(jī)到瓦片中心的距離;seeDenominator 表示2 倍的tan(fov/2)值[5]。
圖3 LOD 調(diào)度流程圖
如圖3 所示在LOD 級(jí)別跳躍過(guò)程中:
a.判斷根節(jié)點(diǎn)是否滿足SSE 要求,如果根節(jié)點(diǎn)不滿足要求整個(gè)樹不會(huì)被渲染。
b.判斷tileset 是否定義skipLevelOfDetail,如果沒(méi)有則執(zhí)行基礎(chǔ)遍歷,獲取基礎(chǔ)屏幕空間誤差與最大屏幕空間誤差,如果有則執(zhí)行跳躍遍歷。
c.基礎(chǔ)遍歷是一個(gè)深度優(yōu)先遍歷過(guò)程,遍歷所有可見的瓦片并標(biāo)記。如果skipLevelOfDetail 處于禁用狀態(tài),則直到所有子瓦片都加載后,瓦片才會(huì)進(jìn)行refine 操作,這個(gè)是傳統(tǒng)的替換求精方法,稱為基遍歷。屏幕空間誤差大于基本屏幕空間誤差的瓦片進(jìn)行基本遍歷,所有其他瓦片都跳過(guò)遍歷。
d.跳躍遍歷過(guò)程,遍歷樹并檢查其選定的幀是否為當(dāng)前幀,如果是將其添加到選擇文件中排隊(duì)。這是一個(gè)前序遍歷過(guò)程,因此子節(jié)點(diǎn)優(yōu)先于父節(jié)點(diǎn)被選中,這樣可以很容易地標(biāo)記出它們的選擇深度。
e.遍歷完之后對(duì)滿足要求的文件請(qǐng)求文件、渲染解析。
根據(jù)以上步驟判斷瓦片是否滿足當(dāng)前視點(diǎn)要求下的LOD渲染策略,如果滿足則進(jìn)行請(qǐng)求文件、解析渲染文件如果不滿足則用該節(jié)點(diǎn)的子節(jié)點(diǎn)去重新判斷是否滿足當(dāng)前視點(diǎn)要求的渲染策略,這樣實(shí)現(xiàn)了動(dòng)態(tài)去調(diào)度不同lod 級(jí)別的數(shù)據(jù)。
3D Tiles 三維空間數(shù)據(jù)格式包含一個(gè)json 索引文件,索引文件中包含了每個(gè)瓦片的幾何誤差、包圍體信息、瓦片數(shù)據(jù)的引用路徑、父子節(jié)點(diǎn)關(guān)系等。索引文件包含了整個(gè)三維瓦片的所有節(jié)點(diǎn)信息,由這些節(jié)點(diǎn)構(gòu)成一個(gè)多叉樹。在Cesium 中通過(guò)Cesium3DTile 類管理,通過(guò)廣度優(yōu)先遍歷索引文件,形成節(jié)點(diǎn)樹用于后面的一系列操作[6]。三維瓦片的調(diào)度過(guò)程如圖4 所示。
圖4 瓦片調(diào)度過(guò)程圖
如圖4 所示,在三維可視化過(guò)程中對(duì)三維瓦片調(diào)度時(shí):
a. 首先定義一個(gè)Cesium3DTileset 類來(lái)管理三維瓦片數(shù)據(jù)。包括了索引文件的解析、節(jié)點(diǎn)樹的構(gòu)建等。
b.解析三維瓦片數(shù)據(jù)的索引文件,通過(guò)廣度優(yōu)先的方式遍歷整個(gè)索引文件,從而得到三維瓦片數(shù)據(jù)的樹狀結(jié)構(gòu)。其中樹狀結(jié)構(gòu)每個(gè)節(jié)點(diǎn)包含了一個(gè)瓦片的幾何誤差、包圍體信息、旋轉(zhuǎn)矩陣、子節(jié)點(diǎn)等信息,具體含義如下:
1 子節(jié)點(diǎn)屬性:表示當(dāng)前瓦片的所有子瓦片。
2 旋轉(zhuǎn)矩陣:表示當(dāng)前瓦片的旋轉(zhuǎn)矩陣,旋轉(zhuǎn)矩陣是具有級(jí)聯(lián)關(guān)系的,當(dāng)前瓦片的位置是由其父節(jié)點(diǎn)的旋轉(zhuǎn)矩陣乘以當(dāng)前節(jié)點(diǎn)的旋轉(zhuǎn)矩陣計(jì)算得來(lái)的。
3 包圍體屬性:表示當(dāng)前瓦片所包含的三維空間數(shù)據(jù)大的包圍體信息,有三種表示方法:地理范圍、AABB 包圍盒、包圍球三種方式。
4 幾何誤差屬性:表示瓦片所包含三維空間數(shù)據(jù)的分辨率信息。用來(lái)計(jì)算瓦片的空間屏幕誤差,即瓦片的LOD 級(jí)別,便于在三維可視化時(shí)進(jìn)行判斷。
c.根據(jù)相機(jī)的視點(diǎn)和視景體對(duì)樹結(jié)構(gòu)的根節(jié)點(diǎn)進(jìn)行裁剪測(cè)試,如果根節(jié)點(diǎn)對(duì)象可見或者部分可見,根據(jù)屏幕空間誤差因子判斷多細(xì)節(jié)層次是否滿足當(dāng)前視點(diǎn)下的要求,如果滿足則進(jìn)行d,如果不滿足則對(duì)子節(jié)點(diǎn)進(jìn)行c,如果當(dāng)前節(jié)點(diǎn)對(duì)象不可見則直接剔除。
d.對(duì)通過(guò)瓦片的可見性判斷并且滿足當(dāng)前視點(diǎn)下的允許的最大屏幕空間誤差條件,請(qǐng)求三維瓦片數(shù)據(jù),通過(guò)requestTiles、requestContent、updateTiles 等操作請(qǐng)求瓦片數(shù)據(jù),并根據(jù)瓦片的具體格式采用不同的解析方法來(lái)進(jìn)行解析渲染工作。若該瓦片請(qǐng)求成功則將該瓦片的contentUnloaded 屬性設(shè)置為false,避免重復(fù)請(qǐng)求。
e.瓦片更新是根據(jù)索引文件中的refine 屬性來(lái)進(jìn)行瓦片的更新替換過(guò)程。它有兩種方式add 和replace。add 就是把請(qǐng)求完成的節(jié)點(diǎn)對(duì)象解析渲染加入到當(dāng)前場(chǎng)景中。replace 是當(dāng)前的節(jié)點(diǎn)對(duì)象的多細(xì)節(jié)層次不能滿足要求,則用其滿足要求的子孫節(jié)點(diǎn)瓦片進(jìn)行替換。
此平臺(tái)以B/S 模式的三維WebGIS 框架為基礎(chǔ),結(jié)合WebGL 圖形硬件加速渲染技術(shù),依托Cesium 平臺(tái),設(shè)計(jì)和實(shí)現(xiàn)基于Cesium 的三維虛擬地球可視化系統(tǒng)。系統(tǒng)采用前后端分離的方式進(jìn)行開發(fā),前端采用Vue 框架進(jìn)行模塊化設(shè)計(jì)、后端采用Nodejs 框架進(jìn)行數(shù)據(jù)的發(fā)布以及整個(gè)平臺(tái)的發(fā)布、數(shù)據(jù)庫(kù)采用MySql 來(lái)存儲(chǔ)三維地理要素的屬性信息,如圖5 所示。系統(tǒng)集成了三維場(chǎng)景繪制、三維漫游、三維測(cè)量、屬性信息查詢等功能。
圖5 系統(tǒng)總體架構(gòu)圖
本文基于WebGL 渲染管線,通過(guò)視場(chǎng)裁剪算法、LOD 調(diào)度策略優(yōu)化,解決Cesium 場(chǎng)景中要素可見性判斷問(wèn)題,通過(guò)剔除場(chǎng)景中不可見要素,降低Cesium 的渲染工作量,減輕瀏覽器的工作負(fù)擔(dān)。在此基礎(chǔ)上,結(jié)合三維瓦片的數(shù)據(jù)結(jié)構(gòu)利用多叉樹的數(shù)據(jù)調(diào)度算法,解決海量數(shù)據(jù)的按需傳輸加載問(wèn)題,實(shí)現(xiàn)快速移動(dòng)的場(chǎng)景中三維空間數(shù)據(jù)的流暢渲染。采用前后端技術(shù)并結(jié)合MySQL 數(shù)據(jù)庫(kù),形成了一套可進(jìn)行查詢、分析、管理等的三維WebGIS 平臺(tái)。