轉載請宣告出處:全網@秋意正寒 https://www.cnblogs.com/onsummer/p/13128682.html
一、一個簡單的3dTiles資料示例

上圖是一份 3dTiles資料集在檔案夾內的樣子,層層打開可得以下特點:
- 入口檔案是
tileset.json - 各級瓦片用檔案夾(目錄)來組織
3dTiles 資料目前的具體檔案實作,是一些零散的檔案,
資料集的名稱與所在檔案夾的名稱并無關系,資料集的名稱寫在入口檔案中,
3dTiles至少有一個 tileset.json 檔案,作為整個資料集的入口,它是一個 json 檔案,描述了整個三維瓦片資料集,它記錄的是上一節提及的“邏輯資訊”,還包括一些其他的元資料,而“屬性資訊”、“嵌入的gltf模型” 則位于各個二進制瓦片檔案中,這些二進制檔案則由 tileset.json 中的瓦片中的 uri 來參考,
瓦片是什么?
瓦片,屋頂上的瓦片,古時候,蓋房子,屋頂不能一次澆筑完工,也沒有特定的“屋頂”零件,所以只好一片片瓦片蓋上去(我瞎掰的),

瓦片切割了三維資料,允許三維資料進行細分,我們都知道網速是有限的,在加載超大規模的三維模型資料時,不可能把一個模型全部下載下來再渲染,那樣等待的時間太慢了,但是一點一點出現,視野范圍外的“瓦片”則干脆就不下載、渲染,性能、視覺都有提高,這就是瓦片的設計優點,
傳統的二維地圖瓦片,叫做 WMTS 或 TMS,這個 "T" 就是 Tile 的意思,
現在,你只要知道,3dTiles就是把空間進行切塊,每個塊叫做 “tile”,也即瓦片,至于怎么切的——待會介紹 tileset.json 時,會隆重介紹樹結構,

瓦片只有兩種情況:葉子瓦片,非葉子瓦片,根瓦片也是非葉子瓦片,非葉子瓦片和葉子瓦片有什么區別呢?主要就是葉子瓦片不會再有孩子了(樹結構的知識哈,不懂的建議去學習資料結構中的樹),
瓦片包含什么內容呢?本篇稍微靠后再仔細了解瓦片,
現在,我們先認識一下,描述整個 3dTiles 資料集的入口檔案,也叫做三維瓦片資料集 —— tileset.json:
二、Tileset——(三維)瓦片資料集
通常,一個三維瓦片資料集(之后簡稱:一個3dtiles資料)的入口就是那個”tileset.json“,至于這個檔案的名稱可不可以改,暫時未作測驗,
現在,我們先來研究研究 這個入口檔案記錄了哪些資訊,拿一份最簡單的 3dtiles資料來舉例,該資料只有一個根瓦片(root),根瓦片再無子瓦片,

root物件中有一個content,內有uri屬性,其就記錄了根瓦片的二進制資料檔案的URL,這個URL是個相對路徑,相對于 tileset.json 檔案,
① 頂級屬性概覽
通過上面介紹,3dTiles資料的入口檔案是一個名叫 tileset.json 的檔案,而通常來說,這個json必須存在以下幾個頂級物件:
- asset
- root
- geometricError
由于本人學識有限,目前不太清楚 geometricError 的精確含義,只知道這個數值的大小能控制 LOD 的顯示隱藏,且這個數值父級瓦片一定比子級瓦片大,
asset 物件,記錄了整個資料集的宣告和歸屬資料,類似于資料宣告,能在此寫入 version、tilesetVersion 等屬性,當然也可以像上方的例子一樣,寫入生成工具、gltf朝向等資訊,
root 物件,即這個資料集的根瓦片,每個3dTiles資料集必須有一個 root 物件,
至于 tileset.json 中其他的頂級物件,請查閱官方檔案:點我
② root瓦片及其children
樹結構對于三維空間資料的組織有很大的優勢,3dTiles在空間上允許資料集使用如下幾種樹結構:
- 四叉樹
- 八叉樹
- KD樹
- 格網結構
四叉樹允許使用傳統的均勻四叉樹,也允許使用松散四叉樹等變種(例如,允許子節點,即子瓦片允許存在空間范圍重疊),

上圖為兩個子瓦片在空間上存在部分重疊,照顧到了建筑物不可能嚴格切分的特點,
四叉樹對在高度上不太好切分的資料比較適合,而如果追求極致的空間分割和分級(例如點云資料),那么八叉樹更合適,

八叉樹也允許使用各種變種,
kd樹比較難理解,在此不作展開,這也是一種有趣的空間結構分割的資料結構,
格網結構的樹允許瓦片存在多個子瓦片:

通常出現在傾斜攝影資料上,但是這會導致網路請求過多的問題,
③ 坐標系統
我們可以用簡單的兩位數、三位數:經緯度,還有一個高度來標識地球表面附近的任何一個點,經緯度的范圍不超過三位數,而用米作單位的空間直角坐標系來描繪地球,數字太大,不好記憶,
在GIS中,WGS84就是一個用經緯度來標識空間坐標的“地理坐標系,Geographic Coordinate System”,
由于歷史上對地球測量的技術不同,科學家制造了多個長半軸短半軸不太一樣的“橢球”,來模擬地球的形狀,目前,最具代表性的就是兩個以地球質心為中心的橢球體:
- WGS84橢球體
- 中國國家2000橢球體(即CGCS2000)
基于橢球體,我們允許有多種不同的坐標系定義,WGS84坐標系其實并不太嚴謹,基于WGS84橢球(長短半軸等資訊自行查詢哈),可以使用球面坐標度量,即經緯度,還有一個從質心射向橢球面上的點的“橢球高度”射線,來記錄第三維高度資料,
介紹了那么多,3dTiles其實采用的是WGS84橢球,但是并未采用經緯度記錄資料:因為相對于精細三維模型來說,經緯度不足以提供足夠精確的空間分割(要照顧圖形顯示問題),所以,同樣是那個形狀,3dTiles使用了同一個WGS84橢球,但是更方便計算的坐標:空間直角坐標,
用經緯度記錄資料的WGS84坐標系,WKID是4326,用地心為坐標原點的空間直角坐標來記錄資料的坐標系,WKID是4979.
3dTiles 用的就是4979坐標系,
三、Tile——構成3dtiles的成員:瓦片
通常,瓦片物件會參考一個二進制的瓦片資料檔案(也有例外,往下拉一點會說):

在1.0 版本的規范中,瓦片所參考的二進制的瓦片資料檔案,有四種型別:
| 型別 | 英文名稱 | 檔案后綴名 |
|---|---|---|
| 批量三維模型 | Batch 3D Model | b3dm |
| 實體三維模型 | Instance 3D Model | i3dm |
| 點云 | PointCloud | pnts |
| 復合模型 | Component | cmpt |
這些不同的瓦片對應了些什么資料呢?本篇只貼一張各種資料型別的截圖和資訊對比表:

| 瓦片型別 | 對應實際資料 |
|---|---|
| b3dm | 傳統三維建模資料、BIM資料、傾斜攝影資料 |
| i3dm | 一個模型多次渲染的資料,燈塔、樹木、椅子等 |
| pnts | 點云資料 |
| cmpt | 前三種資料的復合(允許一個cmpt檔案內嵌多個其他型別的瓦片) |
關于這些二進制瓦片資料檔案的資料結構如何,下一篇開始會詳細展開,
現在,我們關注一下,瓦片物件的職能,也就是,它記錄了啥資訊:

這是一個children下的第一個瓦片,觀察不難得知,與root瓦片其實在屬性上長得一模一樣,
瓦片物件都有如下屬性:
- boundingVolume:空間范圍框,允許有box、sphere、region三種范圍框,但是只能定義一種
- geometricError:幾何誤差
- content:瓦片內容,uri屬性參考二進制瓦片資料檔案,
- 其他屬性:viewerRequestVolume、transform
沒錯,瓦片物件記錄的就是瓦片的元資料,真正瓦片的本體資料在content所參考的二進制檔案中,
瓦片還可以再參考 3dTiles 資料集!
我一再強調3dTiles十分靈活,
Tile不僅僅可以在其uri屬性中參考 諸如 .b3dm、.i3dm、.pnts等二進制瓦片資料檔案,還可以再參考一個 3dTiles!

這是一份從osgb傾斜攝影資料轉換而來的3dtiles資料,清晰可見在root瓦片的第一個child瓦片中,參考了另外一個json檔案,這證明了兩件事:
- 3dTiles的檔案名可以不是tileset.json
- 3dTiles允許套娃
原則上,只要被參考的子一級3dtiles 不回圈參考父級3dtiles,那么就OK(規范如是說),
它真的很靈活!
下一節將展示二進制瓦片檔案中的至關重要的一部分:兩大資料表,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/779.html
標籤:GIS
