3dTile技术研究-概念详述(7)Batched 3D Model

上篇:3dTile技术研究-概念详述(6)

下篇:3dTile技术研究-概念详述(8)Feature Table

1. 内容(Contents)

  • 概述(Overview)
  • 布局(Layout)
    • Padding
  • 标头(Header)
  • Feature Table
    • Semantics
      • Feature semantics
      • Global semantics
  • Batch Table
  • Binary glTF
    • Coordinate system
  • File extension and MIME type
  • 样例实现(Implementation example)
  • Property reference

2. 概述(Overview)

Batched 3D Model 允许离线批处理合并异构的3D模型(比如在城市中的不同建筑物),为了更高效的传输到web客户端进行渲染和交互。高效来自于在一起请求中传输多个模型,并且在最少次数的WebGL的draw calls中渲染它们。

每个对象(Per-model)的属性,比如IDs,使得在运行时单独标记和更新对象成为可能,比如,显示/隐藏,高亮颜色等等。属性可能被用来,比如,从web服务器中查询元数据(比如返回为了获取建筑物的地址和返回的ID)。或者一个属性可能被快速的引用去改变对象的外观展示,再比如,基于属性值是什么而改变高亮颜色。

一个Batched 3D Model(.b3dm)是小端存储方式的二进制数据流。

 

3. 布局(Layout)

一个tile由两部分组成:一个标头和紧随其后的内容体。下面的图片展示了Batched 3D Model的布局(虚线标记的是可选的字段):

 

3dTile技术研究-概念详述(7)Batched 3D Model_第1张图片

4. 填充(Padding)

一个tile的byteLength必须以8字节边界进行对齐。其包含的Feature Table和Batch Table必须符合它们自己的填充要求。

这个binary glTF必须开始和结束语8字节的边界,这样glTF的字节对齐要求可以得到保障。这可以通过填充Feature Table或Batch Table(如果它们被定义了的话)。

5. 标头(Header)

这个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 TableBatch Table Binary glTF。

6. Feature Table

包含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.

6.1 语义(Semantics)

6.1.1 Feature semantics

目前没有针对于单个对象(per-feature)的语义。

6.1.2 Global semantics

这些语义为所有的对象(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 batchId attribute, this field must be 0.

在批处理中可区分的对象(models, also called features)数量。如果二进制的glTF没有batchId特性,这个字段必须是0。

✅ 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.

 

 

 

 

3dTile技术研究-概念详述(7)Batched 3D Model_第2张图片

7. Batch Table

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.

8. Binary glTF

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);如果有这种场景,这个点就需要复制多份,这样点的特性就可以赋值予不同的batchIds了。

在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中定义标识构件相关的属性了?书读百遍其义自见,以前对这一块的理解不够深入,现在借着写该系列博客的机会对一些知识点有新的和深入的理解了。

9. 坐标系(Coordinate system)

默认的嵌入的glTFs使用了一个y-up的右手坐标系。为了保持与3D Tiles的z-up坐标系的一致性,在运行时必须对glTFs进行转换。详细参考glTF transforms。

为了高精度的渲染,点位置(Vertex positions)可能被定义成相对于中心的(relative-to-center ),参考Precisions, Precisions。如果定义了,RTC_CENTER指定了所有点(vertex)相对的中心,在坐标系转换和glTF的节点层次转换矩阵应用之后而应用。

10. File extension and MIME type

Batched 3D Model tiles使用.b3dm扩展格式和application/octet-stream MIME type。

显示的文件扩展名是可选的。有效的实现可能会忽略高扩展名而在标头的 magic字段标记内容的格式。

这个在上文提过并且举了例子,不再赘述。

11. 样例实现(Implementation example)

本章节是非规范性的

在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

 

你可能感兴趣的:(BIM,图形学,lod,3dtiles,cesium,BIM,图形学)