孟天杭
(北京建筑大學(xué)測(cè)繪與城市空間信息學(xué)院,北京100000)
近年來(lái),隨著無(wú)人機(jī)、激光掃描等數(shù)據(jù)采集技術(shù)的發(fā)展,有效降低了三維空間數(shù)據(jù)的獲取成本和時(shí)間周期,提高了數(shù)據(jù)精度。然而,隨著大規(guī)模三維空間數(shù)據(jù)的不斷積累,三維空間數(shù)據(jù)如何在B/S 下高效地發(fā)布、共享、交換、傳輸,成為一個(gè)亟待解決的問(wèn)題。
Cesium 是當(dāng)前應(yīng)用最廣泛的三維GIS 框架之一,無(wú)需任何插件可直接在瀏覽器端展示三維虛擬地球并疊加豐富的地理空間數(shù)據(jù),是一個(gè)跨平臺(tái)、開源、輕量級(jí)的WebGis 表現(xiàn)層庫(kù)。Cesium 使用的三維瓦片數(shù)據(jù)格式是3D Tiles,該數(shù)據(jù)格式是由AGI 公司于2015 年6 月制定的一套用于流式傳輸大量異構(gòu)3D地理空間數(shù)據(jù)集的開放規(guī)范[1]。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)行可視化、共享和互操作等難題[2]。
3D Tiles 雖然是開源的一套規(guī)范,但如何對(duì)多源異構(gòu)數(shù)據(jù)建立三維瓦片,目前還存在很多的問(wèn)題。雖然AGI 公司開源了部分3D Tiles 處理工具,在傾斜攝影數(shù)據(jù)方面已經(jīng)能很好地進(jìn)行處理,但在人工大模型和點(diǎn)云方面還沒有很好地解決方案。本文通過(guò)詳細(xì)研究3D Tiles 的規(guī)范,致力于形成一套針對(duì)人工大模型和點(diǎn)云三維瓦片構(gòu)建的解決方案[3]。
構(gòu)成3D Tiles 的基本框架是瓦片集,瓦片集包括索引文件和瓦片數(shù)據(jù)。索引數(shù)據(jù)是對(duì)整個(gè)瓦片集的說(shuō)明以及瓦片的空間組織結(jié)構(gòu)的存儲(chǔ),而瓦片數(shù)據(jù)負(fù)責(zé)存儲(chǔ)單個(gè)瓦片內(nèi)所有的三維空間數(shù)據(jù),包括模型數(shù)據(jù)、點(diǎn)云數(shù)據(jù)、影像數(shù)據(jù)、矢量數(shù)據(jù)、屬性數(shù)據(jù)等。索引文件包含了版本號(hào)、資產(chǎn)說(shuō)明、根節(jié)點(diǎn)、幾何誤差等屬性,其中根節(jié)點(diǎn)又包含了boundingVolume、refine、content、children、transform 等信息; 瓦片數(shù)據(jù)有b3dm、pnts、i3dm、cmpt 四種瓦片數(shù)據(jù)格式[4]。
三維瓦片構(gòu)建之前首先對(duì)三維場(chǎng)景進(jìn)行分割,包括八叉樹構(gòu)建、網(wǎng)格簡(jiǎn)化、點(diǎn)云抽稀三個(gè)關(guān)鍵的步驟。
場(chǎng)景分割的方法有很多種,其中最常見的有網(wǎng)格劃分、四叉樹分割、k-d 樹,八叉樹等[5]。應(yīng)用八叉樹在對(duì)三維空間數(shù)據(jù)的處理中是效果很好的一種數(shù)據(jù)結(jié)構(gòu),因此在海量三維體數(shù)據(jù)處理過(guò)程中,應(yīng)用八叉樹數(shù)據(jù)結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行分解,按實(shí)際需要進(jìn)行分級(jí)分塊,可以實(shí)現(xiàn)對(duì)大規(guī)模三維數(shù)據(jù)的高效存儲(chǔ)和管理。本文將使用八叉樹數(shù)據(jù)結(jié)構(gòu)對(duì)三維場(chǎng)景進(jìn)行劃分,通過(guò)將大場(chǎng)景細(xì)分為很多子場(chǎng)景,進(jìn)而生成3D Tiles 瓦片數(shù)據(jù)。
圖1 八叉樹基本結(jié)構(gòu)圖
如圖1 所示,每次將立方體分為八個(gè)子立方體,第一次分割得到8 個(gè)立方體,第二次分割得到64 個(gè)立方體,每個(gè)立方體都有對(duì)應(yīng)的唯一編碼且對(duì)應(yīng)三維場(chǎng)景中一小部分,這也符合3D Tiles 的設(shè)計(jì)理念。將模型數(shù)據(jù)和點(diǎn)云數(shù)據(jù)按照此八叉樹的結(jié)構(gòu)進(jìn)行分割,為后續(xù)三維瓦片構(gòu)建做準(zhǔn)備。
網(wǎng)格簡(jiǎn)化采用的是一種三角形折疊算法,對(duì)原始模型的三角形預(yù)分類,簡(jiǎn)化過(guò)程中以三角形的狹長(zhǎng)度、局部區(qū)域面積控制三角形簡(jiǎn)化順序,較好地保持了模型原始特征,簡(jiǎn)化速度較快[6]。
圖2 簡(jiǎn)化折疊示意圖
此算法是將三角網(wǎng)中某個(gè)滿足條件的三角形簡(jiǎn)化為一個(gè)頂點(diǎn)V,并將此三角形三個(gè)頂點(diǎn)所有的關(guān)聯(lián)點(diǎn)與新頂點(diǎn)V 相連,同時(shí)刪除與該三角形相鄰接的三角形,此種簡(jiǎn)化方法刪除的基本元素是三角面片。如圖2 所示,一次折疊過(guò)程可刪除三角形T0、T1、T2、T3,頂點(diǎn)V1、V2、V3并生成一個(gè)新頂點(diǎn)V0,并將V4到V9分別與V0相連。
點(diǎn)云抽稀算法有很多種,基于八叉樹的格網(wǎng)抽稀、基于系統(tǒng)抽稀、基于距離和高差抽稀、基于曲率的點(diǎn)云抽稀等,本文采用基于八叉樹的格網(wǎng)抽稀算法。
圖3 點(diǎn)云抽稀示意圖
如圖3 所示,點(diǎn)云抽稀的原理為計(jì)算在此格網(wǎng)內(nèi)所有點(diǎn)到網(wǎng)格中心的距離,進(jìn)行距離排序,選擇距離最小的點(diǎn)作為代替點(diǎn),用該點(diǎn)去取代整個(gè)格網(wǎng)內(nèi)所有點(diǎn)。
基于八叉樹的格網(wǎng)抽稀算法步驟為:
a.散亂點(diǎn)輸入;b.計(jì)算包圍盒;c.判斷是否滿足劃分條件;d.網(wǎng)格劃分;e.計(jì)算距離最小點(diǎn);f.進(jìn)行點(diǎn)替代。
glTF 是一種適用于海量三維空間數(shù)據(jù)傳輸?shù)娜S格式。這種數(shù)據(jù)格式的內(nèi)部結(jié)構(gòu)與WebGL 的渲染機(jī)制基本一致,所以更加符合基于WebGL 的應(yīng)用需要。由于其緊湊的文件結(jié)構(gòu),使得用glTF 來(lái)表示三維空間數(shù)據(jù)所占用的容量更小,同時(shí)也減少了轉(zhuǎn)換與使用這些三維數(shù)據(jù)的成本。glTF 能夠快速加載且不依賴特定的應(yīng)用、它的內(nèi)容具有可擴(kuò)展性更適合開發(fā)者用來(lái)定義獨(dú)有的數(shù)據(jù)格式。
glTF 的組成具有一定的規(guī)則,它包含了場(chǎng)景、節(jié)點(diǎn)、網(wǎng)格、訪問(wèn)器、材質(zhì)等。由這些屬性組成了場(chǎng)景入口、場(chǎng)景的組織者、幾何的定義者、外觀決定者、數(shù)據(jù)訪問(wèn)規(guī)則、數(shù)據(jù)的存儲(chǔ)者。其中scene 代表場(chǎng)景的入口;node 代表場(chǎng)景的組織者;mesh 代表幾何的定義者;material、texture、image 代表外觀決定者;accessor 代表數(shù)據(jù)訪問(wèn)規(guī)則;buffer 代表數(shù)據(jù)存儲(chǔ)者。三維空間數(shù)據(jù)的幾何信息和紋理信息都存在二進(jìn)制buffer 中,并通過(guò)bufferView 去訪問(wèn),并可通過(guò)設(shè)置偏移量來(lái)訪問(wèn)某一部分?jǐn)?shù)據(jù)這也是glTF 加載效率快的原因之一。
場(chǎng)景分割完之后要進(jìn)行三維瓦片的構(gòu)建,實(shí)質(zhì)上是多源異構(gòu)數(shù)據(jù)向3D Tiles 轉(zhuǎn)換的過(guò)程。由于3D Tiles 所能包含的數(shù)據(jù)類別太多,本文只針對(duì)人工大模型和點(diǎn)云的三維瓦片構(gòu)建。三維場(chǎng)景在進(jìn)行八叉樹分割完后生成很多小文件,瓦片的構(gòu)建過(guò)程就是把這些小文件轉(zhuǎn)化為3D Tiles 支持的文件格式,b3dm、i3dm、pnts 等。
圖4 b3dm 文件結(jié)構(gòu)圖
由圖4 所示,b3dm 文件大體分為兩部分,第一部分由28 字節(jié)的文件頭組成,包括了標(biāo)識(shí)頭、版本號(hào)、總字節(jié)長(zhǎng)度、特征表、要素表等。第二部分由特征表、(要素表)和glb(glTF 的二進(jìn)制形式)組成。其中g(shù)lTF 格式在上文已經(jīng)進(jìn)行介紹,在gltf 的基礎(chǔ)上加入一些要素信息就形成了b3dm 文件。
pnts 文件也是由兩部分組成,第一部分由28 字節(jié)的文件頭組成,第二部分由特征表和要素表組成。不同的是點(diǎn)云信息存儲(chǔ)在featureTable 中,而不是存儲(chǔ)在gltf 中,featureTable 包括點(diǎn)的顏色、法線、RGB、RTC_CENTER、BATCH_ID 等信息。
通過(guò)c++程序語(yǔ)言將場(chǎng)景分割生成的場(chǎng)景小文件轉(zhuǎn)換為b3dm 或者pnts 瓦片數(shù)據(jù)。瓦片數(shù)據(jù)生成完以后重要的是如何去組織這些瓦片數(shù)據(jù),也就是生成索引文件的過(guò)程。索引文件可以是具有空間一致性的任何空間數(shù)據(jù)結(jié)構(gòu),包括k-d 樹、四叉樹、八叉樹和網(wǎng)格等。每一個(gè)瓦片都有對(duì)應(yīng)的包圍盒、旋轉(zhuǎn)矩陣、幾何誤差、父節(jié)點(diǎn)、子節(jié)點(diǎn)等信息,索引文件的構(gòu)建就是把瓦片之間的層級(jí)關(guān)系,每個(gè)瓦片的描述信息等用某一種空間數(shù)據(jù)結(jié)構(gòu)組織起來(lái)。
本文通過(guò)對(duì)Cesium 框架和三維瓦片數(shù)據(jù)格式的深入剖析,通過(guò)對(duì)三維場(chǎng)景八叉樹的構(gòu)建,進(jìn)行場(chǎng)景分割、網(wǎng)格簡(jiǎn)化、點(diǎn)云抽稀等操作,建立模型和點(diǎn)云的多細(xì)節(jié)層次文件。利用c++編程語(yǔ)言將場(chǎng)景小文件轉(zhuǎn)化為3DTiles 所支持b3dm、pnts 瓦片數(shù)據(jù)格式,將每個(gè)瓦片數(shù)據(jù)的包圍盒、旋轉(zhuǎn)矩陣、幾何誤差等信息按照八叉樹空間數(shù)據(jù)結(jié)構(gòu)組織生成索引文件,最終生成具有多分辨率層次的三維瓦片數(shù)據(jù)格式。