logo资料库

b3dm格式数据结构说明.docx

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
Layerout(排列分布)
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 拓展,这对于高精度渲染大有裨益。
分享到:
收藏