3dTile技术研究-概念详述(8)Feature Table

上篇:3dTile技术研究-概念详述(7)Batched 3D Model

下篇:3dTile技术研究-概念详述(9)Batch Table

1. 内容(Contents)

  • 概述(Overview)
  • 布局(Layout)
    • Padding
    • JSON header
    • Binary body
  • 样例实现(Implementation example)
  • Property reference

2. 概述(Overview)

Feature Table是tile的二进制内容体的一部分,它描述了渲染tile中每个对象(feature)需要的position和显示属性。而从另一方面说,Batch Table包含了每个对象(per-feature)特定于程序的的不是渲染必须的属性。

Feature Table在tile格式,像Batched 3D Model (b3dm,每个model都是一个feature)和Point Cloud (pnts,每个点都是一个feature)中使用。

model和feature都是指对象,可以简化理解为构件、建筑物等。

每个对象(Per-feature)的属性通过tile的特定于格式的语义定义,语义在每个tile的格式规范中定义。比如,对于Instanced 3D ModelSCALE_NON_UNIFORM定义了应用于每个3D model示例的非均匀缩放。

3. 布局(Layout)

Feature Table由两部分组成:一个JSON表头和一个可选的小端方式存储的二进制体。JSON属性名字是tile的特定于格式的语音,且它们的值既可以直接在JSON中定义,又可以引用二进制提中的内容片段。在二进制体中存储长的数值型的数组是很高效的。下面的图片显示了Feature Table的布局:

3dTile技术研究-概念详述(8)Feature Table_第1张图片

当一个tile包含Feature Table时,Feature Table紧随在tile的标头之后。标头将会包含 featureTableJSONByteLengthfeatureTableBinaryByteLength uint32字段,它们可以用来解析Feature Table的对应部分。

3.1 填充(Padding)

JSON标头必须在包含的tile二进制文件内的8字节边界处结束。JSON标头必须用尾随空格字符(0x20)填充才能满足此要求。

二进制主体必须在包含的tile二进制文件内的8字节边界处开始和结束。为了满足此要求,必须用任意值的附加字节来填充二进制体。

二进制属性必须以一个字节偏移量开始,该字节偏移量是该属性的隐式组件类型的字节大小的倍数。例如,隐式组件类型为FLOAT的属性的每个元素有4个字节,因此必须开始于一个以4的倍数的偏移量。为了满足此要求,必须在前面的二进制属性中填充其他任意值的字节。

3.2 JSON标头(JSON header)

Feature Table的值可以以三种不同的方式出现在JSON标头中:

  1. 一个单独的值或对象,比如,"INSTANCES_LENGTH" : 4
    • 这用来表达类似于"INSTANCES_LENGTH"的全局语义,该语义定义了一个Instanced 3D Model格式的tile中model实例的数量。
  2. 一个值的数组,比如,"POSITION" : [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
    • 这个是为了表达Instanced 3D Model中的每个对象(per-feature)的类似于"POSITION"的语义。上面,每个POSITION指向了一个float32[3]数据类型,所以这里有三个对象:Feature 0position=(1.0, 0.0, 0.0)Feature 1 position=(0.0, 1.0, 0.0)Feature 2 position=(0.0, 0.0, 1.0)
  3. 用一个有一个byteOffset属性的对象来标记指向二进制内容体的引用,比如,"SCALE" : { "byteOffset" : 24}
    • byteOffset指定了一个相对于二进制体起始位置的以0开始的偏移。byteOffset的值必须是属性的隐式的组件类型的字节大小的倍数,比如,"POSITION"属性的组件类型是FLOAT (4 bytes),所以byteOffset的值必须是4的倍数。
    • 语义定义了允许的数据类型,比如Instanced 3D Model中的"POSITION"引用了二进制体内容,组件类型就是FLOAT,组件数量就是3。
    • 一个语音允许重新隐式的组件类型。这些场景在每个tile格式(比如b3dm、i3dm)中指定,比如"BATCH_ID" : { "byteOffset" : 24, "componentType" : "UNSIGNED_BYTE"}。JSON标头中仅有的有效的属性是tile格式定义的语义和可选的extrasextensions属性。特定于程序的数据应该存储在Batch Table中。

tile format 即tile格式,就是b3dm、i3dm等格式。

See Property reference for the full JSON header schema reference. The full JSON schema can be found in featureTable.schema.json.

3.3 二进制体(Binary body)

当JSON标头包含了指向二进制体的引用时,提供的byteOffset被用来索引数据。下面的图片显示了在Feature Table的二进制体中索引数据的过程。

3dTile技术研究-概念详述(8)Feature Table_第2张图片

可以用feature语义定义的features的数量(featuresLength)、期望的feature id(featureId)和数据类型(组件类型和组件数量)来获取属性值。

4. 样例实现(Implementation example)

本章节是非规范性的

下面的示例使用POSITION(数据类型为float32[3])语义获取位置属性。

var byteOffset = featureTableJSON.POSITION.byteOffset;

var positionArray = new Float32Array(featureTableBinary.buffer, byteOffset, featuresLength * 3); // There are three components for each POSITION feature.
var position = positionArray.subarray(featureId * 3, featureId * 3 + 3); // Using subarray creates a view into the array, and not a new array.

在CesiumJS实现的3D Tiles中的Cesium3DTileFeatureTable.js可以找到读取Feature Table的代码。

 

传送:

3dTile技术研究-开篇

3dTile技术研究-概述

3dTile技术研究-概念详述(1)

3dTile技术研究-概念详述(2)

3dTile技术研究-概念详述(3)

3dTile技术研究-概念详述(4)

3dTile技术研究-概念详述(5)

3dTile技术研究-概念详述(6)

3dTile技术研究-概念详述(7)Batched 3D Model

3dTile技术研究-概念详述(9)Batch Table

你可能感兴趣的:(BIM,图形学,lod,3dtiles,BIM,cesium,图形学)