B3dm
Batched 3D Model 允许批量的多样性的 3D 模型,比如在一个城市的不同建
筑模型,高效地在 web 客户端渲染和交互并脱机显示。这高效性体现在用一个简
单的请求就可以转移多个模型,用一些最简洁的 webgl 的必要的绘制请求就可以
实现渲染。使用核心 3D Tiles 特定的规范语言,每个模型都是一个要素。
每一个模型属性,比如 IDs,能够使单个模型在运行时被识别和更新,例如,
显示/隐藏,高亮色等等属性。例如,为了查询一个访问元数据的 web 服务,比
如通过得到一幢建筑的 ID 来得到它的地址。或者为了改变模型的外观,一个属
性值会在运行中被引用,例如,根据属性值来改变高亮色彩。
Batched 3D Model , 或 仅 仅 是 batch , 是 作 为 一 个 ArrayBuffer 存 储 在
JavaScript 的从小到大的二进制文件。
Layerout(排列分布)
一个 tile 又两部分组成:一个紧跟着 body(主体)的头文件(header)
一.头文件(Header):
这 24-byte header 包括如下字段:
字段类型
字段
4-byte ANSI
string
uint32
version
magic
byteLength
uint32
batchTableJSONByteLen
gth
uint32
batchTableBinaryByteL
ength
uint32
batchLength
unit32
描述
"b3dm". 这可以用来识别 ArrayBuffer 是
否就是 b3dm
B3dm 的当前格式版本号. 当前版本为 1.
整个瓦片的长度, 包括头文件.用字节表
示
JSON 部分的批量表的长度,还是用字节表
示。零表示没有批处理表。
二进制部分的批量表的长度,用字节表
示。如果 batchtablejsonbytelength(就
是上面那个熟悉)是零,这也是零
在一捆模型中具体的模型(有时候也叫要
素)得个数
主体部分紧接头部分,由两个部分组成:Batch Table 和 Binary gltf。
阅读标题代码可以在 3D 切片实施 batched3dmodeltilecontent 发现 Cesium。
二.包体(Batch Table):
Batch Table 包含了每个模型的特殊请求的元数据,用 batchid 作为索
引,同时也可以用来作陈述性的描述和一些诸如“填充 UI”或者“发行一个
REST API 请求”的特殊请求。在 Binary glTF 这个部分中,每个顶点都有一
个 batchid 数值属性,这个数值是一个整数,范围在[0,number of models
in the batch - 1]之间。Batchid 这个属性可以说明这个我们选中的“顶点”
是属于哪个模型的。这也成为了模型可以捆成一捆处理而依然能够分别出来
的先决条件。
三.二进制 gltf(Binary glTF):
gltf 是 WebGL 的运行资产格式。Binary glTF 是 gltf 的一个用二进制定义
的拓展模块。Batched 3D Model 使用基于 KHR_binary_extension 拓展的 gltf1.0
格式。
Binart glTF 是 紧 跟 着 batch table 的 。 从 数 组 缓 冲 区 的 开 头
20+batchTableByteLength 的字节处开始,一直到数组缓冲区剩下的部分结束。
Binary glTF 可以嵌入它支持的所有的几何形状,纹理和动画,或适用于外部资
源的部分或所有数据。
对于 gltf 内容必须 8 字节对齐,所以 gltf 的字节对齐也是必须的。这可以
通过填充 Batch Table 来完成,如果它存在的话。
如上所述,每个顶点都有一个 batchid 属性来标明其所属的模型。例如,一
个拥有三个模型的模型束的顶点可能看起来像这样:
2,
2,
...]
1,
1,
0,
0,
..., 2,
..., 1,
batchId: [0,
position: [xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
normal:
[xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
顶点的顺序和 batchid 没啥关系,所以这样也行:
batchId: [0,
position: [xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
[xyz, xyz, xyz, ..., xyz, xyz, xyz, ..., xyz, xyz, xyz, ...]
normal:
..., 2,
..., 1,
1,
2,
1,
0,
2,
0,
...]
需要指明的是,顶点不能同时属于一个以上模型;如果真的出现那样的情况
了,顶点需要再重复声明一次,重复的顶点分别属于哪些模型。
batchid 由 gltf 的_BATCHID 技术参数确定。例如:
"technique": {
"attributes": {
"a_batchId": "batchId"
},
"parameters": {
"batchId": {
"semantic": "BATCHID",
"type": 5123
}
}
}
就拿上面这个例子中“attributes”中的“a_batchid”来说吧,在顶点着色器
中是这么写的
attribute float a_batchId;
通过使用存取在模型束中的单个模型的 a_batchId 熟悉,我们可以在运行中
修改顶点着色器的属性,比如,我们就可以改变它的颜色。
当 Batch Table 存在的时候,batchId 属性(基于_BATCHGID 的语义参数)
是需要的。否则 Batch Table 就不存在了。
虽然不是特别需要,但是用户还是可以根据自己的喜好找一下 glTF 的
CESIUM_RTC 拓展,这对于高精度渲染大有裨益。