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

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

  • Batched3DModel3DTileContentjson

  • Instanced3DModel3DTileContent數據結構

  • PointCloud3DTileContent佈局

  • Composite3DTileContent測試

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

渲染

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

 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。 blog

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

相關文章
相關標籤/搜索