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






