3D Tiles批处理3D模型 (Batched 3D Model)数据格式标准规范

导航


官网文档

概述

批处理 3D 模型允许离线批处理混合的 3D 模型(例如城市中的各个建筑物),高效地以流式传输到 Web 客户端进行渲染和交互。在单个请求中传输多个模型,并使用最少数量的 WebGL 调用来渲染以提供高效率。使用 3D Tiles core 规范语言,每个模型都是一个要素。

每个模型的属性(例如 ID)都可以在运行时识别和更新,例如显示/隐藏,高亮颜色等。属性可以用于通过 Web 服务查询访问元数据,例如传递建筑物的 ID 以获取其地址,动态修改引用的属性以更改模型的外观,基于属性值更改高亮颜色等等。

批处理 3D 模型数据是小端字节序的二进制 Blob。


文件结构

数据由两部分组成:文件头和紧随其后的主体。下图显示了“批处理 3D 模型”文件结构(虚线表示可选字段):

结构填充

数据 byteLength 必须以 8 个字节进行边界对齐。包含的要素表(Feature Table)批处理表(Batch Table)必须符合其各自的填充要求。

二进制 glTF 的开始和结束位置必须以 8 个字节进行边界对齐,以便满足 glTF 的字节对齐要求。这可以通过填充功能表或批处理表(如果存在)来实现。


文件头

28 字节的文件头包含以下字段:

字段名 数据类型 描述
magic 4-byte ANSI string "b3dm". 用于标识为“批处理 3D 模型”
version uint32 版本。现在是1
byteLength uint32 整个数据的长度(包括文件头),以字节为单位
featureTableJSONByteLength uint32 要素表 JSON 部分的长度(以字节为单位)
featureTableBinaryByteLength uint32 要素表二进制部分的长度(以字节为单位)
batchTableJSONByteLength uint32 批处理表 JSON 部分的长度(以字节为单位)。零表示没有批处理表
batchTableBinaryByteLength uint32 批处理表二进制部分的长度(以字节为单位)。如果batchTableJSONByteLength为零,则也将为零。

文件主体部分紧跟着文件头,并且由三个字段组成:Feature TableBatch Table,和Binary glTF


要素表

包含b3dm语法。

要素表(Feature Table) 查看更多信息。

属性参考 查看 b3dm 要素表的更多参考。

完整 JSON 定义:

{
  "$schema": "http://json-schema.org/draft-04/schema",
  "id": "b3dm.featureTable.schema.json",
  "title": "Batched 3D Model Feature Table",
  "type": "object",
  "description": "A set of Batched 3D Model semantics that contain additional information about features in a tile.",
  "allOf": [
    {
      "$ref": "featureTable.schema.json"
    },
    {
      "properties": {
        "BATCH_LENGTH": {
          "description": "A `GlobalPropertyScalar` object defining a numeric property for all features. See the corresponding property semantic in [Semantics](/specification/TileFormats/Batched3DModel/README.md#semantics).",
          "allOf": [
            {
              "$ref": "featureTable.schema.json#/definitions/globalPropertyScalar"
            }
          ]
        },
        "RTC_CENTER": {
          "description": "A `GlobalPropertyCartesian3` object defining a 3-component numeric property for all features. See the corresponding property semantic in [Semantics](/specification/TileFormats/Batched3DModel/README.md#semantics).",
          "allOf": [
            {
              "$ref": "featureTable.schema.json#/definitions/globalPropertyCartesian3"
            }
          ]
        },
        "extensions": {
          "$ref": "extension.schema.json"
        },
        "extras": {
          "$ref": "extras.schema.json"
        }
      },
      "required": ["BATCH_LENGTH"]
    }
  ]
}

语法定义

要素语法

当前没有按要素的语法。


全局语法

以下语法定义了所有要素的全局属性。

语法 数据类型 描述 是否必须
BATCH_LENGTH uint32 数据中可区分模型(要素)的数量。如果 Binary glTF 没有batchId属性,则此字段必须为0 Yes.
RTC_CENTER float32[3] 当位置相对于中心定义时,由三维数组定义的中心位置(请参阅坐标系)。 🔴 No.

批处理表

批处理表包含每一模型的应用特定属性,通过batchId索引,可被用于声明样式和应用特定的使用,如填充 UI 或者进行 REST API 请求。在二进制 glTF 部分,每个顶点都有一个 batchId 的数值属性,整型数组范围内[0, number of models in the batch - 1]。batchId 指示该顶点所属的模型。这样可以将模型整合在一起(batched together),并且仍然可以识别。

更多相关信息,请参见批处理表(Batch Table)


二进制 glTF

批处理 3D 模型嵌入了包含模型几何和纹理信息的glTF 2.0

二进制 glTF 紧随要素表和批处理表。它可能嵌入了其所有的几何,纹理和动画,或者可能引用了某些或所有这些数据的外部来源。

如上所述,每个顶点具有 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, ...]

注意,一个顶点不能属于多个模型。在这种情况下,需要复制顶点,以便batchIds 可以分配。

batchId 参数是在 glTF 图元中通过设置_BATCHID 属性定义的,batchId的值对应 accessor 的顺序索引。例如,

"primitives": [
    {
        "attributes": {
            "_BATCHID": 0
        }
    }
]
{
  "accessors": [
    {
      "bufferView": 1,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 4860,
      "max": [2],
      "min": [0],
      "type": "SCALAR"
    }
  ]
}

accessor.type的值必须是"SCALAR"。所有其他属性必须符合 glTF 模式,但没有其他额外要求。

当批处理表存在或BATCH_LENGTH属性大于0时,_BATCHID属性为必填;否则,可以不填。


坐标系

默认情况下,嵌入式 glTF 使用右手坐标系,其中 y 轴朝上。为了与 3D Tiles 的 z 向上坐标系保持一致,必须在运行时转换 glTF。详细信息,请参考glTF 转换

可以相对于中心定义顶点位置以进行高精度渲染,请参见Precisions,Precisions。如果定义,则 RTC_CENTER 指定在应用坐标系变换和 glTF 节点层次结构变换之后,所有顶点位置都相对于其的中心位置。


扩展名和 MIME 类型

批处理 3D 模型数据使用.b3dm扩展名和application/octet-stream的 MIME 类型。

显式文件扩展名是可选的。有些实现可能会忽略它,并通过 magic 其标头中的字段标识内容的格式。


实例

本节是非规范性的

可以在 CesiumJS 的 3D Tiles 实现中找到读取文件头的代码 Batched3DModelTileContent.js


属性参考


批处理 3D 模型要素表

一组批处理 3D 模型定义,其中包含有关数据中要素的额外信息。

类型 描述 是否必须
extensions object 扩展特定的字典对象 No
extras any 应用程序特定数据 No
BATCH_LENGTH object, number [1], number 一个全局标量属性对象定义所有要素得数据属性,查看相应语法定义 Yes
RTC_CENTER object, number [3] 一个全局笛卡尔坐标系属性对象定义的所有要素的 3 个数值属性,查看相应语法定义 No

允许其他属性。


二进制体引用

一个对象,定义对要素表的二进制主体的引用部分,如果未在 JSON 中直接定义属性值,则在该部分储存。

类型 描述 是否必须
byteOffset number 缓冲区的偏移量(以字节为单位) Yes

允许其他属性。


全局笛卡尔坐标系属性

定义所有要素的全局三维数组属性对象。


全局标量属性

定义所有要素的全局数值属性对象。


属性

用户自定义的属性,用来在数据中指定每个要素的应用程序特定的元数据。值可以直接在 JSON 中定义为数组,也可以引用二进制体中的部分。


JSON 定义示例

{
  "$schema": "http://json-schema.org/draft-04/schema",
  "id": "featureTable.schema.json",
  "title": "Feature Table",
  "type": "object",
  "description": "A set of semantics containing per-tile and per-feature values defining the position and appearance properties for features in a tile.",
  "definitions": {
    "binaryBodyReference": {
      "title": "BinaryBodyReference",
      "type": "object",
      "description": "An object defining the reference to a section of the binary body of the features table where the property values are stored if not defined directly in the JSON.",
      "properties": {
        "byteOffset": {
          "type": "number",
          "description": "The offset into the buffer in bytes.",
          "minimum": 0
        },
        "componentType": {
          "type": "number",
          "description": "The datatype of components in the property. This is defined only if the semantic allows for overriding the implicit component type. These cases are specified in each tile format.",
          "enum": [
            "BYTE",
            "UNSIGNED_BYTE",
            "SHORT",
            "UNSIGNED_SHORT",
            "INT",
            "UNSIGNED_INT",
            "FLOAT",
            "DOUBLE"
          ]
        }
      },
      "required": ["byteOffset"]
    },
    "numericArray": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "property": {
      "title": "Property",
      "description": "A user-defined property which specifies per-feature application-specific metadata in a tile. Values either can be defined directly in the JSON as an array, or can refer to sections in the binary body with a `BinaryBodyReference` object.",
      "oneOf": [
        {
          "$ref": "#/definitions/binaryBodyReference"
        },
        {
          "type": "array",
          "items": {
            "type": "number"
          }
        },
        {
          "type": "number"
        }
      ]
    },
    "globalPropertyBoolean": {
      "title": "GlobalPropertyBoolean",
      "description": "An object defining a global boolean property value for all features.",
      "type": "boolean"
    },
    "globalPropertyScalar": {
      "title": "GlobalPropertyScalar",
      "description": "An object defining a global numeric property value for all features.",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "byteOffset": {
              "type": "number",
              "description": "The offset into the buffer in bytes.",
              "minimum": 0
            }
          },
          "required": ["byteOffset"]
        },
        {
          "type": "array",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1
        },
        {
          "type": "number",
          "minimum": 0
        }
      ]
    },
    "globalPropertyCartesian3": {
      "title": "GlobalPropertyCartesian3",
      "description": "An object defining a global 3-component numeric property values for all features.",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "byteOffset": {
              "type": "number",
              "description": "The offset into the buffer in bytes.",
              "minimum": 0
            }
          },
          "required": ["byteOffset"]
        },
        {
          "type": "array",
          "items": {
            "type": "number"
          },
          "minItems": 3,
          "maxItems": 3
        }
      ]
    },
    "globalPropertyCartesian4": {
      "title": "GlobalPropertyCartesian4",
      "description": "An object defining a global 4-component numeric property values for all features.",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "byteOffset": {
              "type": "number",
              "description": "The offset into the buffer in bytes.",
              "minimum": 0
            }
          },
          "required": ["byteOffset"]
        },
        {
          "type": "array",
          "items": {
            "type": "number"
          },
          "minItems": 4,
          "maxItems": 4
        }
      ]
    }
  },
  "properties": {
    "extensions": {
      "$ref": "extension.schema.json"
    },
    "extras": {
      "$ref": "extras.schema.json"
    }
  },
  "additionalProperties": {
    "$ref": "#/definitions/property"
  }
}

版权声明:
除非注明,本博文章均为原创,转载请以链接形式标明本文地址。



   转载规则


《3D Tiles批处理3D模型 (Batched 3D Model)数据格式标准规范》 Jackie Tang(唐浩桀) 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
3D Tiles实例3D模型(Instanced 3D Model)数据格式标准规范 3D Tiles实例3D模型(Instanced 3D Model)数据格式标准规范
导航 引 概述 文件结构 结构填充 文件头 要素表 语法定义 实例语法 全局语法 实例方向 八进制编码的法向向量 默认方向 实例位置 RTC_CENTER 量化位置 实例缩放 例子 仅位置 量化位置和八进
下一篇 
文章中超链接打开方式target修改 文章中超链接打开方式target修改
问题hexo-theme-matery主题默认配置了所有链接都是从新窗口中打开,但自己写的文章锚点,我们肯定希望直接页面内直接跳转就行了,否则的话打开的页面就太多了。 原理修改配置的话,在/themes/hexo-theme-mate
2021-04-23
  目录