目录
1. b3dm 概念解析
1. What‘s b3dm
2. b3dm 格式的数据结构有两部分组成 : header / body
1. b3dm 数据也是基于 gltf 的 ( 单模型基础上做了批量化处理 )
3. b3dm 文件解析
1. 局部文件 解析结果 ( 临时方案 )
BATCH_LENGTH
id[] / revitId[] / properties[]
JSON
b3dm 是一个缩写,它的全称是:Batched 3D Mode ( 批量化 3d 模型 ) , 顾名思义,批量化指的是一定有很多个,不止一个
Batched 3D Model allows offline batching of heterogeneous 3D models, such as different buildings in a city, for efficient streaming to a web client for rendering and interaction. Efficiency comes from transferring multiple models in a single request and rendering them in the least number of WebGL draw calls necessary. Using the core 3D Tiles spec language, each model is a feature. Per-model properties, such as IDs, enable individual models to be identified and updated at runtime, e.g., show/hide, highlight color, etc. Properties may be used, for example, to query a web service to access metadata, such as passing a building's ID to get its address. Or a property might be referenced on the fly for changing a model's appearance, e.g., changing highlight color based on a property value. A Batched 3D Model tile is a binary blob in little endian. -------------------------------------------------------------------------------------------------------- 译文:b3dm允许不同类型的3d模型,例如城市里不同的建筑,组织成高效的数据流到web端渲染和交互,这种高效率来自于一次请求转化多个模型并且用最少的webGL消耗。在3d tiles特殊的语言中,每一个模型都是一个要素。 每一个模型的属性,例如ID能够将模型分离成单个的个体,同样也能对这些模型做更新,颜色变化,是否展示等这样的操作,模型的属性也会有所使用, 举个例子来说,通过网络服务去访问元数据,通过建筑的id去访问它的地址,或者动态的属性决定模型外观,根据属性值来改变颜色高度。
b3dm 瓦片 是一个 二进制 的 blob
b3dm 也是一种数据格式,这种格式符合3d tiles规范,能够做一些操作,比如说查询,分层设色等。
b3dm 格式的数据通常都是城市的批量化的建筑模型,例如 , 倾斜摄影模型。在实际的生产应用中,倾斜摄影(或者别的格式的大批量模型)的格式并不是b3dm 格式的,绝大多数的倾斜摄影模型格式是 osgb,还有一部分是 obj,所以我们需要把它转化成 b3dm 格式的数据,才能进行进一步的操作。
b3dm 格式的数据结构有两部分组成,header 和 body( 有点像 html )
header 部分主要记录了一些 例如版本,字节长度之类的信息。
body 部分主要由3个文件构成 feature table batch table 和 binary gltf
feature table 记录了模型的语义信息,包括每个模型的特征值信息。
batch table 记录了模型的样式以及 rest 请求,还有一些属性信息。
注意 :
b3dm 数据也是基于 gltf 的,也就是说批量的模型中的单个模型的模型格式还是 gltf,并且数据组织方式也和之前讲到过的 gltf 是一样的。
说白了 b3dm 就是在原来 gltf 小模型,单个模型的基础之上,做了批量化的数据组织方式,多了 feature table 和 batch table 两个文件。
数据源 准备阶段 1、通过 WinHex 解析 b3bm 格式文件 2、截取 解析正常的部分数据 3、截取部分 另存为xxx.txt 文件 4、通过 json 工具类 校验格式 ------------------------------------------------------- 解析数据数理化阶段 1、抽象统一解析 保存好的 JSON 格式文本文件 2、所需数据实例化至数据库
{ "BATCH_LENGTH": 23 }
{ "id": [ "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d2bb", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d2c8", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d2e5", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d2ea", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d2f1", "467801da-3f36-4be3-b3f9-f2de8b0aa99f-0057ae4b", "e8f36b26-a5b1-4026-b578-620c5738b68e-0059b23b", "e8f36b26-a5b1-4026-b578-620c5738b68e-0059b241", "e8f36b26-a5b1-4026-b578-620c5738b68e-0059b289", "e8f36b26-a5b1-4026-b578-620c5738b68e-0059b2a0", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d41b", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d420", "aabe04fe-bd80-4e6b-bd1c-7ca5db50ef0c-0056d427", "6fa5dcf6-ff4a-4930-aac9-b797f57b424b-00576625", "6fa5dcf6-ff4a-4930-aac9-b797f57b424b-0057663f", "6fa5dcf6-ff4a-4930-aac9-b797f57b424b-0057665e", "6fa5dcf6-ff4a-4930-aac9-b797f57b424b-00576660", "467801da-3f36-4be3-b3f9-f2de8b0aa99f-0057ae0c", "9f961a30-3b3d-44a2-b73a-db9d54125ba5-00597277", "c28ca6fe-7b52-4d98-b06b-e65b6f1c93b2-0059cd54", "c28ca6fe-7b52-4d98-b06b-e65b6f1c93b2-0059cdbc", "c28ca6fe-7b52-4d98-b06b-e65b6f1c93b2-0059cdc7", "c28ca6fe-7b52-4d98-b06b-e65b6f1c93b2-0059cdce" ], "revitId": [ "5690043", "5690056", "5690085", "5690090", "5690097", "5746251", "5878331", "5878337", "5878409", "5878432", "5690395", "5690400", "5690407", "5727781", "5727807", "5727838", "5727840", "5746188", "5862007", "5885268", "5885372", "5885383", "5885390" ], "properties": [ { "图像": "<无>", "底部高程": "3240.00 mm", "顶部高程": "3340.00 mm", "尺寸": "400 mmx100 mm", "标记": "2261", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "400 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3290.00 mm", "开始偏移": "3290.00 mm", "端点偏移": "3290.00 mm", "长度": "834.04 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "200 mmx100 mm", "标记": "2262", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "2555.39 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "200 mmx100 mm", "标记": "2264", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "20043.04 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "200 mmx100 mm", "标记": "2265", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "18723.21 mm" }, { "图像": "<无>", "底部高程": "3240.00 mm", "顶部高程": "3340.00 mm", "尺寸": "200 mmx100 mm", "标记": "2266", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3290.00 mm", "开始偏移": "3290.00 mm", "端点偏移": "3290.00 mm", "长度": "249.24 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "200 mmx100 mm", "标记": "2284", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "18723.21 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "200 mmx100 mm", "标记": "2293", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "14616.67 mm" }, { "图像": "<无>", "底部高程": "3240.00 mm", "顶部高程": "3340.00 mm", "尺寸": "200 mmx100 mm", "标记": "2294", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3290.00 mm", "开始偏移": "3290.00 mm", "端点偏移": "3290.00 mm", "长度": "711.98 mm" }, { "图像": "<无>", "底部高程": "3300.29 mm", "顶部高程": "3389.71 mm", "尺寸": "200 mmx100 mm", "标记": "2295", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3346.41 mm", "开始偏移": "3346.41 mm", "端点偏移": "3343.59 mm", "长度": "5.64 mm" }, { "图像": "<无>", "底部高程": "3300.29 mm", "顶部高程": "3389.71 mm", "尺寸": "200 mmx100 mm", "标记": "2296", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "200 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3343.59 mm", "开始偏移": "3343.59 mm", "端点偏移": "3346.41 mm", "长度": "5.64 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2270", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "10853.27 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2271", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "18507.78 mm" }, { "图像": "<无>", "底部高程": "3230.00 mm", "顶部高程": "3330.00 mm", "尺寸": "100 mmx100 mm", "标记": "2272", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3280.00 mm", "开始偏移": "3280.00 mm", "端点偏移": "3280.00 mm", "长度": "1368.66 mm" }, { "图像": "<无>", "底部高程": "3230.00 mm", "顶部高程": "3330.00 mm", "尺寸": "100 mmx100 mm", "标记": "2273", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3280.00 mm", "开始偏移": "3280.00 mm", "端点偏移": "3280.00 mm", "长度": "4294.11 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2274", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "18507.78 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2275", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "10853.27 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2276", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "8384.77 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2282", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "18507.78 mm" }, { "图像": "<无>", "底部高程": "3230.00 mm", "顶部高程": "3330.00 mm", "尺寸": "100 mmx100 mm", "标记": "2289", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3280.00 mm", "开始偏移": "3280.00 mm", "端点偏移": "3280.00 mm", "长度": "224.62 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2297", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "601.77 mm" }, { "图像": "<无>", "底部高程": "3350.00 mm", "顶部高程": "3450.00 mm", "尺寸": "100 mmx100 mm", "标记": "2300", "标高前缀": "BL", "桥架类型": "CT", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3400.00 mm", "开始偏移": "3400.00 mm", "端点偏移": "3400.00 mm", "长度": "4852.49 mm" }, { "图像": "<无>", "底部高程": "3276.89 mm", "顶部高程": "3403.11 mm", "尺寸": "100 mmx100 mm", "标记": "2301", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3359.81 mm", "开始偏移": "3359.81 mm", "端点偏移": "3320.19 mm", "长度": "79.23 mm" }, { "图像": "<无>", "底部高程": "3276.89 mm", "顶部高程": "3403.11 mm", "尺寸": "100 mmx100 mm", "标记": "2302", "创建的阶段": "新构造", "拆除的阶段": "无", "水平对正": "中心", "垂直对正": "中", "宽度": "100 mm", "高度": "100 mm", "参照标高": "管线综合", "偏移": "3359.81 mm", "开始偏移": "3359.81 mm", "端点偏移": "3320.19 mm", "长度": "79.23 mm" } ] }
1. id[] : 构件 id 数组
{ "scene": 0, "asset": { "generator": "gltf-samples-generator", "version": "2.0" }, "scenes": [ { "name": "-1", "nodes": [ 0 ] } ], "nodes": [ { "name": "-1", "mesh": 0 } ], "meshes": [ { "name": "-1", "primitives": [ { "attributes": { "POSITION": 0, "NORMAL": 1, "_BATCHID": 2 }, "indices": 3, "material": 0 } ] } ], "materials": [ { "name": "MaterialNode_8355711_0", "pbrMetallicRoughness": { "roughnessFactor": 1.0, "baseColorFactor": [ 0.498039216, 0.498039216, 0.498039216, 1.0 ], "metallicFactor": 0.0 }, "alphaMode": "OPAQUE", "doubleSided": true } ], "accessors": [ { "min": [ 21.8017368, 21.23, -39.46816 ], "max": [ 42.94478, 21.45, -19.6449471 ], "bufferView": 0, "byteOffset": 0, "componentType": 5126, "count": 1104, "type": "VEC3" }, { "min": [ -1.0, -1.0, -1.0 ], "max": [ 1.0, 1.0, 1.0 ], "bufferView": 0, "byteOffset": 12, "componentType": 5126, "count": 1104, "type": "VEC3" }, { "min": [ 0.0 ], "max": [ 22.0 ], "bufferView": 0, "byteOffset": 24, "componentType": 5126, "count": 1104, "type": "SCALAR" }, { "min": [ 0 ], "max": [ 1103 ], "bufferView": 1, "byteOffset": 0, "componentType": 5123, "count": 1932, "type": "SCALAR" } ], "bufferViews": [ { "buffer": 0, "byteLength": 30912, "byteOffset": 0, "target": 34962, "byteStride": 28 }, { "buffer": 0, "byteLength": 3864, "byteOffset": 30912, "target": 34963 } ], "buffers": [ { "byteLength": 34776 } ] }