上篇:3dTile技术研究-概念详述(6)
下篇:3dTile技术研究-概念详述(8)Feature Table
Batched 3D Model 允许离线批处理合并异构的3D模型(比如在城市中的不同建筑物),为了更高效的传输到web客户端进行渲染和交互。高效来自于在一起请求中传输多个模型,并且在最少次数的WebGL的draw calls中渲染它们。
每个对象(Per-model)的属性,比如IDs,使得在运行时单独标记和更新对象成为可能,比如,显示/隐藏,高亮颜色等等。属性可能被用来,比如,从web服务器中查询元数据(比如返回为了获取建筑物的地址和返回的ID)。或者一个属性可能被快速的引用去改变对象的外观展示,再比如,基于属性值是什么而改变高亮颜色。
一个Batched 3D Model(.b3dm)是小端存储方式的二进制数据流。
一个tile由两部分组成:一个标头和紧随其后的内容体。下面的图片展示了Batched 3D Model的布局(虚线标记的是可选的字段):
一个tile的byteLength
必须以8字节边界进行对齐。其包含的Feature Table和Batch Table必须符合它们自己的填充要求。
这个binary glTF必须开始和结束语8字节的边界,这样glTF的字节对齐要求可以得到保障。这可以通过填充Feature Table或Batch Table(如果它们被定义了的话)。
这个28字节长的标头包含如下的字段:
Field name | Data type | Description |
---|---|---|
magic |
4-byte ANSI string | "b3dm" . This can be used to identify the content as a Batched 3D Model tile. |
version |
uint32 |
The version of the Batched 3D Model format. It is currently 1 . |
byteLength |
uint32 |
The length of the entire tile, including the header, in bytes. |
featureTableJSONByteLength |
uint32 |
The length of the Feature Table JSON section in bytes. |
featureTableBinaryByteLength |
uint32 |
The length of the Feature Table binary section in bytes. |
batchTableJSONByteLength |
uint32 |
The length of the Batch Table JSON section in bytes. Zero indicates there is no Batch Table. |
batchTableBinaryByteLength |
uint32 |
The length of the Batch Table binary section in bytes. If batchTableJSONByteLength is zero, this will also be zero. |
内容体部分紧随在标头部分之后,并且它由三部分构成:Feature Table
, Batch Table
和 Binary glTF。
包含b3dm
语义值。
更多的有效的信息请参考Feature Table specification。
See Property reference for the b3dm
feature table schema reference. The full JSON schema can be found in b3dm.featureTable.schema.json.
目前没有针对于单个对象(per-feature)的语义。
这些语义为所有的对象(all features)定义了全局的属性。
Semantic | Data Type | Description | Required |
---|---|---|---|
BATCH_LENGTH |
uint32 |
The number of distinguishable models, also called features, in the batch. If the Binary glTF does not have a 在批处理中可区分的对象(models, also called features)数量。如果二进制的glTF没有 |
✅ Yes. |
RTC_CENTER |
float32[3] |
A 3-component array of numbers defining the center position when positions are defined relative-to-center, (see Coordinate system). 一个3个数值元素的数组,它定义了中心位置(当位置被定义为中心相关的时候),详细参考Coordinate system。 |
No. |
Batch Table包含了每个对象(per-model)的特定于程序的属性(可通过batchId
索引),这可以被用于声明式样式(declarative styling)和特定于程序的场景(比如填充UI,发起一个REST API请求)。在二进制的glTF部分,每个点(vertex)有一个数值类型的特性, batchId
(范围在[0, number of models in the batch - 1]
)。batchId
定义了点(vertex)所述的对象(model)。这允许对象(models)可以被合并在一起(为了高效传输和渲染),但仍旧可以是独立识别的。
高效来自于在一起请求中传输(合并后的)多个模型,并且在最少次数的WebGL的draw calls中渲染它们。
See the Batch Table reference for more information.
Batched 3D Model嵌入了glTF 2.0,其中包含模型的几何和纹理信息。
binary glTF紧随在Feature Table和Batch Table之后。它可以嵌入所有的几何、纹理和动画数据,也可以引用外部的资源来表达部分或所有的这些数据。像上面所述的那样,每个点(vertex)都可以一个batchId
特性来标记它属于哪个对象(model)。例如,一个有3个对象的batch的点(vertices)可能看起来像这样:
batchId: [0, 0, 0, ..., 1, 1, 1, ..., 2, 2, 2, ...]
position: [xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
normal: [xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
由于点(vertices)不需要根据batchId
来排序,所以下面这样也是可能的:
batchId: [0, 1, 2, ..., 2, 1, 0, ..., 1, 2, 0, ...]
position: [xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
normal: [xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
注意:一个点(vertex)不可以同时属于多个对象(model);如果有这种场景,这个点就需要复制多份,这样点的特性就可以赋值予不同的batchId
s了。
在glTF的mesh primitive中提供有_BATCHID
特性可以指定batchId
参数,可以赋值予batchId
accessor的索引。比如,
"primitives": [
{
"attributes": {
"_BATCHID": 0
}
}
]
{
"accessors": [
{
"bufferView": 1,
"byteOffset": 0,
"componentType": 5126,
"count": 4860,
"max": [2],
"min": [0],
"type": "SCALAR"
}
]
}
这里(batchId
accessor)的accessor.type
字段必须是"SCALAR"
,所有的属性必须符合glTF的格式方案,除此之外没有其他额外要求。
当出现了Batch Table或者BATCH_LENGTH
属性大于0,_BATCHID
特性是要求有的;其它的情况就不需要有_BATCHID
特性了。
mesh、primitive、accessor是glTF中的概念;primitive是几何实体,一个mesh可以由一个primitive数组构成,而accessor是为了更方便的访问bufferView数据而设置的,比如可以通过某个accessor来方便的访问
batchId
数据;primitive中的position、normal、_BATCHID
等几何数据特性都可以指向(accessors数组中的)accessor的索引。
注意此处有新的理解: primitive中的
_BATCHID
特性是指向了batchId
accessor,这样batchId就可以是一个构件的标识了,就不需要额外在Batch Table中定义标识构件相关的属性了?书读百遍其义自见,以前对这一块的理解不够深入,现在借着写该系列博客的机会对一些知识点有新的和深入的理解了。
默认的嵌入的glTFs使用了一个y-up的右手坐标系。为了保持与3D Tiles的z-up坐标系的一致性,在运行时必须对glTFs进行转换。详细参考glTF transforms。
为了高精度的渲染,点位置(Vertex positions)可能被定义成相对于中心的(relative-to-center ),参考Precisions, Precisions。如果定义了,RTC_CENTER
指定了所有点(vertex)相对的中心,在坐标系转换和glTF的节点层次转换矩阵应用之后而应用。
Batched 3D Model tiles使用.b3dm
扩展格式和application/octet-stream
MIME type。
显示的文件扩展名是可选的。有效的实现可能会忽略高扩展名而在标头的 magic
字段标记内容的格式。
这个在上文提过并且举了例子,不再赘述。
本章节是非规范性的
在CesiumJS实现的3D Tiles中的Batched3DModelTileContent.js
可以找到读取标头的代码。
传送:
3dTile技术研究-开篇
3dTile技术研究-概述
3dTile技术研究-概念详述(1)
3dTile技术研究-概念详述(2)
3dTile技术研究-概念详述(3)
3dTile技术研究-概念详述(4)
3dTile技术研究-概念详述(5)
3dTile技术研究-概念详述(6)
3dTile技术研究-概念详述(8)Feature Table
3dTile技术研究-概念详述(9)Batch Table