上篇:3dTile技术研究-概念详述(7)Batched 3D Model
下篇:3dTile技术研究-概念详述(9)Batch Table
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 Model,SCALE_NON_UNIFORM
定义了应用于每个3D model示例的非均匀缩放。
Feature Table由两部分组成:一个JSON表头和一个可选的小端方式存储的二进制体。JSON属性名字是tile的特定于格式的语音,且它们的值既可以直接在JSON中定义,又可以引用二进制提中的内容片段。在二进制体中存储长的数值型的数组是很高效的。下面的图片显示了Feature Table的布局:
当一个tile包含Feature Table时,Feature Table紧随在tile的标头之后。标头将会包含 featureTableJSONByteLength
和featureTableBinaryByteLength
uint32
字段,它们可以用来解析Feature Table的对应部分。
JSON标头必须在包含的tile二进制文件内的8字节边界处结束。JSON标头必须用尾随空格字符(0x20
)填充才能满足此要求。
二进制主体必须在包含的tile二进制文件内的8字节边界处开始和结束。为了满足此要求,必须用任意值的附加字节来填充二进制体。
二进制属性必须以一个字节偏移量开始,该字节偏移量是该属性的隐式组件类型的字节大小的倍数。例如,隐式组件类型为FLOAT
的属性的每个元素有4个字节,因此必须开始于一个以4
的倍数的偏移量。为了满足此要求,必须在前面的二进制属性中填充其他任意值的字节。
Feature Table的值可以以三种不同的方式出现在JSON标头中:
"INSTANCES_LENGTH" : 4
。
"INSTANCES_LENGTH"
的全局语义,该语义定义了一个Instanced 3D Model格式的tile中model实例的数量。"POSITION" : [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
。
"POSITION"
的语义。上面,每个POSITION
指向了一个float32[3]
数据类型,所以这里有三个对象:Feature 0
的position
=(1.0, 0.0, 0.0)
, Feature 1
的 position
=(0.0, 1.0, 0.0)
, Feature 2
的 position
=(0.0, 0.0, 1.0)
。byteOffset
属性的对象来标记指向二进制内容体的引用,比如,"SCALE" : { "byteOffset" : 24}
。
byteOffset
指定了一个相对于二进制体起始位置的以0开始的偏移。byteOffset
的值必须是属性的隐式的组件类型的字节大小的倍数,比如,"POSITION"
属性的组件类型是FLOAT
(4 bytes),所以byteOffset
的值必须是4的倍数。"POSITION"
引用了二进制体内容,组件类型就是FLOAT
,组件数量就是3。"BATCH_ID" : { "byteOffset" : 24, "componentType" : "UNSIGNED_BYTE"}
。JSON标头中仅有的有效的属性是tile格式定义的语义和可选的extras
和extensions
属性。特定于程序的数据应该存储在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.
当JSON标头包含了指向二进制体的引用时,提供的byteOffset
被用来索引数据。下面的图片显示了在Feature Table的二进制体中索引数据的过程。
可以用feature语义定义的features的数量(featuresLength
)、期望的feature id(featureId
)和数据类型(组件类型和组件数量)来获取属性值。
本章节是非规范性的
下面的示例使用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