Cesium原理篇:3D Tiles(2)數據結構


      上一節介紹3D Tiles渲染調度的時候,我們提到目前Cesium支持的Cesium3DTileContent目前支持如下類型:

  • Batched3DModel3DTileContent

  • Instanced3DModel3DTileContent

  • PointCloud3DTileContent

  • Composite3DTileContent

      其中Composite3DTileContent是復合數據,PointCloud3DTileContent是只包含FeatureTable和BatchTable的點雲數據(從官方給的數據結構來看,我沒有親自測試)。本節主要以Batched3DModel3DTileContent和Instanced3DModel3DTileContent兩種類型,介紹一下3DTiles的數據結構和核心技術點。

渲染

      結合上一節,先給出一個流程圖,建議大圖邊看邊思考。其中紅線是表明狀態變化。TileContent是一個抽象概念,具體是它的繼承類Batched3DModel或Instanced3DModel來完成具體的功能,而每一個具體的Content會根據自己的數據結構的差異而有所差別。

 1

      3D Tiles也是基於狀態,從UNLOADING開始,通過一系列的request,完成最初的數據加載過程,結束LOADING狀態,進入Pocessing過程,也就是數據解析。數據解析完后進入READY狀態,通過selectTile,最終調用Content對應的update方法,構造最終的drawcommand,加入渲染隊列。當然,如果有需要釋放的Tile,則在unloadTiles中處理。細心的人會發現Pocessing和Ready狀態。最終調用的都是update方法。這里解釋一下:3D Tiles中主要的數據部分就是glTF,而glTF也是基於狀態管理的,無論是glTF的解析還是構造DrawCommand,只是state不同,都是在update方法中完成的。如上圖,這里也用橙色箭頭做了說明。

      如上給出了一個相對完整的過程,Content的內容主要是glTF,這塊我們之前也介紹過,所以下面主要集中在b3dm中BatchTable和FeatureTable。

Batched3DModel3DTileContent


      先看看數據結構的大概布局:

 1

      如上,一個header頭,用來說明該數據的類型,布局和具體數據內容。看一下body部分,glTF,以前介紹過。所以,只剩下batchTable了。如果你看看Cesium之Batch篇,你會發現,其實Cesium很早就已經在用batchTable概念了。

      在這里,Cesium3DTileBatchTable和之前的BatchTable在思路上都是一樣的,都是將屬性值保存到紋理中來來使用。但Cesium3DTileBatchTable提供了一個規范的流程,讓用戶通過表達式的方式,很容易的創建出這張tile_batchTexture這里。

 2

      如上是batchtable的內容,以及3d tiles給出的文檔信息,其實batchtable就是一個json對象。同時,batchTable會根據該json的長度(id個數)創建一張對應的tile_batchTexture,用於存儲對應的屬性。同時,有多少個id就有有多少個對應的Cesium3DTileFeature對象,這可以認為是batchtable的訪問器,以id為唯一標識負責batchtable的讀寫操作。

      有了數據以及數據的讀寫方法,就需要提供如何讀寫的規范,這就是Cesium3DTileStyle類的責任。目前默認指定根據json指定顏色,比如根據json對象中的高度值,實現一個根據高度值指定對應顏色的范圍分段效果。當然,如果你知道如何修改shader,那你可以修改代碼創建自己需要的映射關系,實現對應的效果。

 3

      如圖,從字面意義來看,指定了范圍分段的規范,用到了Height屬性,根據conditions中對應的Height區間映射到對應的顏色。我們用肉眼看懂了,那代碼是如何完成這個語義解析呢?

 

4

 

      如上是這個語義解析樹的類結構,也是解析過程的一個示意圖,最終每一個條件都封裝為一個statement,實現自己的判斷標准。

5

      每次遍歷樹上所有statements,找到滿足條件的Node。對比時先看左邊Node節點的left,所用的屬性為Height,這樣,通過feature對應id找到batchTable的Height值,滿足條件則獲取對應的color:purple,不滿足就繼續。

6

      前面提到feature相當於一個訪問器,獲取該值后,直接傳到batchtable對應的batchValues,其中這就是該紋理對應的imageData。Feature對這個讀寫操作進行了屬性封裝,方便用戶的調用。

7

Instanced3DModel3DtileContent

      還是先看看Cesium給出的布局結構:

 8

      batchTable,glTF這些都是已有的內容,讓我們眼前一亮的是featureTable,Cesium提供了Cesium3DTileFeatureTable來封裝。

9

      占是一個具體的featureTable內容。不難理解這個數據的實例化內容就是Position,Cesium通過ModelInstanceCollection來實現Model的實例化,我們之前在Cesium之Instance中介紹過。這里我們重點看看Position實例化矩陣的推導原理,強化一下理解的深度。

10

      如上是對應的Shader和相關的uniform片段。灰選部分是相機的視圖矩陣,而rtcTransform則是中心點(_center)對應的矩陣,czm_instanced_model是傳入的實例化矩陣,czm_instanced_nodeTransform不討論,是父子節點之間相對位置對應的矩陣。根據Shader的公式,我們不難得出,a_position是相對模型中心點的相對位置,而czm_instanced_model則是當前單個模型的中心點對應模型集合中心點的矩陣。

      查看了一下Instanced3DModel3DTileContent實例化對應矩陣的計算過程,數據存儲時還是每一個模型中心點的經緯度信息,在內部轉成相對集合中心點的相對矩陣。

      關於Content就介紹到這,結合上一篇,應該能對3DTile有一個全面的了解。下次以個人的經驗來談一下3D Tile好和不好的部分,當作完結篇。

AGI


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM