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