3dTiles 数据规范详解[4.1] b3dm瓦片二进制数据文件结构

B3dm,Batched 3D Model,成批量的三维模型的意思。

倾斜摄影数据(例如osgb)、BIM数据(如rvt)、传统三维模型(如obj、dae、3dMax制作的模型等),均可创建此类瓦片。

瓦片文件二进制布局(文件结构)

3dTiles 数据规范详解[4.1] b3dm瓦片二进制数据文件结构

① 文件头:占28字节(byte)

位于b3dm文件最开头的28个字节,是7个属性数据:

属性的官方名称 字节长 类型 含义
magic   4   string(或char[4])   该瓦片文件的类型,在b3dm中是 "b3dm"  
version   4   uint32   该瓦片的版本,目前限定是 1.  
byteLength   4   uint32   该瓦片文件的文件大小,单位:byte  
featureTableJSONByteLength   4   uint32   要素表的JSON文本(二进制形式)长度  
featureTableBinaryByteLength   4   uint32   要素表的二进制数据长度  
batchTableJSONByteLength   4   uint32   批量表的JSON文本(二进制形式)长度  
batchTableBinaryByteLength   4   uint32   批量表的二进制数据长度  

其中,

byteLength = 28 + featureTableJSONByteLength + featureTableBinaryByteLength + batchTableJSONByteLength + batchTableBinaryByteLength

② 要素表

回顾上篇,我说的是

要素表,记录的是整个瓦片渲染相关的数据,而不是渲染所需的数据。

那么,b3dm瓦片中的要素表会记录哪些数据呢?

全局属性

什么是全局属性?即对于瓦片每一个三维模型(或BATCH、要素)或者直接对当前瓦片有效的数据,在b3dm中,要素表有以下全局属性:

属性名 属性数据类型 属性描述 是否必须存在
BATCH_LENGTH   uint32   当前瓦片文件内三维模型(BATCH、要素)的个数   yes  
RTC_CENTER   float32[3]   如果模型的坐标是相对坐标,那么相对坐标的中心即此   no  

注意,如果glb模型并不需要属性数据,即要素表和批量表有可能是空表,那么 BATCH_LENGTH 的值应设为 0 .

*要素属性

对于每个模型(BATCH、要素)各自独立的数据。在b3dm中没有。

我们回忆一下要素表的定义:与渲染相关的数据。

b3dm瓦片与渲染相关的数据都在glb中了,所以b3dm并不需要存储每个模型各自独立的数据,即不存在要素属性。

在i3dm、pnts两种瓦片中,要素属性会非常多。

全局属性存在哪里?

全局属性存储在 要素表的JSON中,见下文:

JSON头部数据

由上图可知,文件头28字节数据之后是要素表,要素表前部是 长达 featureTableJSONByteLength 字节的二进制JSON文本,利用各种语言内置的API可以将这段二进制数据转换为字符串,然后解析为JSON对象。

例如,这里解析了一个b3dm文件的 要素表JSON:

{ "BATCH_LENGTH": 4 }

那么,此b3dm瓦片就有4个模型(4个要素,或4个BATCH),其 batchId 是0、1、2、3.

要素表的二进制本体数据

无。

注:

当要素表的 JSON 数据以引用二进制体的方式出现时,数据才会记录在要素表的二进制本体数据中,此时JSON记录的是字节偏移量等信息。

但是在b3dm瓦片中,要素表只需要JSON就可以了,不需要自找麻烦再引用二进制数据,因为BATCH_LENGTH 和 RTC_CENTER 都相对好记录,一个是数值,一个是3元素的数组。

在下面的要介绍批量表中,就会出现 JSON 数据引用二进制体的情况了。在 i3dm 和 pnts 瓦片中,要素表 JSON就会大量引用其二进制体。

③ 批量表

批量表记录的是每个模型的属性数据,以及扩展数据(扩展数据以后再谈)。

要素表和批量表唯一的联系就是 BATCH_LENGTH,在 i3dm 中叫 INSTANCE_LENGTH,在 pnts 中叫 POINTS_LENGTH。

这很好理解,要素表记录了有多少个模型(BATCH、要素),那么批量表每个属性就有多少个值。

JSON头部数据

先上一份批量表的JSON看看:

{ "height" : { "byteOffset" : 0, "componentType" : "FLOAT", "type" : "SCALAR" }, "geographic" : { "byteOffset" : 40, "componentType" : "DOUBLE", "type" : "VEC3" }, }

这个批量表的JSON有两个属性:height、geographic,字面义即模型的高度值、地理坐标值。

height 属性通过其 componentType 指定数据的值类型为 FLOAT,通过其 type 指定数据的元素类型为 SCALAR(即标量)。

geographic 属性通过其 componentType 指定数据的的值类型是 DOUBLE,通过其 type 指定数据的元素类型为 VEC3(即3个double数字构成的三维向量)。

byteOffset ,即这个属性值在 二进制本体数据 中从哪个字节开始存储。

从上表可以看出,height 属性跨越 0 ~ 39 字节,一共40个字节。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfgxj.html