资源描述
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包括如下字段:
字段
字段类型
描述
magic
4-byte ANSI string
"b3dm". 这可以用来识别ArrayBuffer是否就是b3dm
version
uint32
B3dm的当前格式版本号. 当前版本为1.
字段
字段类型
描述
byteLength
uint32
整个瓦片的长度, 包括头文件.用字节表示
batchTableJSONByteLength
uint32
JSON部分的批量表的长度,还是用字节表示。零表示没有批处理表。
batchTableBinaryByteLength
uint32
二进制部分的批量表的长度,用字节表示。如果batchtablejsonbytelength(就是上面那个熟悉)是零,这也是零
batchLength
unit32
在一捆模型中具体的模型(有时候也叫要素)得个数
主体部分紧接头部分,由两个部分组成: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属性来标明其所属的模型。例如,一个
拥有三个模型的模型束的顶点可能看起来像这样:
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, ...]
顶点的顺序和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, ...]
需要指明的是,顶点不能同时属于一个以上模型;如果真的出现那样的情况了,顶点需要再重复声明一次,重复的顶点分别属于哪些模型。
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拓展,这对于高精度渲染大有裨益。
(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。可复制、编制,期待你的好评与关注)
展开阅读全文