上篇:3dTile技术研究-概念详述(3)
3D Tiles使用一个主要的tileset JSON文件作为定义的整个tileset的入口点。入口tileset和外部的tileset JSON文件都不需要遵循特定的命名规范。
下面是Canary Wharf使用的tileset的一个片段(可以在这里看到完整文件tileset.json
):
{
"asset" : {
"version": "1.0",
"tilesetVersion": "e575c6f1-a45b-420a-b172-6449fa6e0a59",
},
"properties": {
"Height": {
"minimum": 1,
"maximum": 241.6
}
},
"geometricError": 494.50961650991815,
"root": {
"boundingVolume": {
"region": [
-0.0005682966577418737,
0.8987233516605286,
0.00011646582098558159,
0.8990603398325034,
0,
241.6
]
},
"geometricError": 268.37878244706053,
"refine": "ADD",
"content": {
"uri": "0/0/0.b3dm",
"boundingVolume": {
"region": [
-0.0004001690908972599,
0.8988700116775743,
0.00010096729722787196,
0.8989625664878067,
0,
241.6
]
}
},
"children": [..]
}
}
tileset JSON有4个顶级属性:asset、properties
、geometricError
、和root
。
asset
属性是一个包含关于整个tileset的元数据的对象。asset.version
属性是一个定义了3D Tiles的版本字符串,它制定了tileset的JSON模式和基础的tile格式集。tilesetVersion
属性是一个可选的字符串,它定义了tileset特定于程序的版本,比如当一个tileset更新了。
properties
是包含了tileset中每个对象(feature)属性的对象。这个tileset JSON片段是3D建筑的,所以每一个tile都包括多个建筑对象,且每个建筑对象由一个Height
属性(参考Batch Table)。properties
中的每个对象的名称是和每个对象(feature)属性的名字匹配的,且它的值定义了最大最小数值,这时有用的,比如对于创建样式的色带时。
batch table片段:
{ "height" : { "byteOffset" : 0, "componentType" : "FLOAT", "type" : "SCALAR" }, "geographic" : { "byteOffset" : 40, "componentType" : "DOUBLE", "type" : "VEC3" } }
geometricError
是一个定义了以米为单位的的非负数值,它决定tileset是否需要渲染。在运行时,geometricError
用来计算以像素度量的Screen-Space Error (SSE)。如果SSE没有超出最低要求,就不需要渲染tileset,同时不需要考虑渲染它的任何tile,详细参考Geometric error。
注意:tileset的
geometricError
决定tileset是否被渲染,也就是root tile是否被渲染;而root tile的geometricError
决定了其children是否需要被渲染,即root tile是否需要被细化。
root
是一个使用了上述章节提到的tile JSON来定义root tile的对象。root.geometricError
和tileset顶级的geometricError
不同的是:tileset的geometricError
是用来在运行时基于计算的SSE判断是否需要渲染tileset的root tile;而root.geometricError
是用来在运行时基于计算的SSE判断是否需要渲染root tile的children的。
为了创建一个树的树(即嵌套的树,并非子树),tile的content.uri
可以指向一个外部的tileset(另一个tileset JSON文件的uri)。这可以使,比如将每一个城市存储到一个tileset中,然后这些tileset共同组成了一个全局的tileset这种场景成为可能。
.
当tile指向了外部的tileset时:该tile需要遵守以下规则:
tile.children
必须是未定义的或者空的数组。transform
作用。比如,下面的tileset引用了一个外部的tileset,那么对于T3的转换矩阵计算后是这样的:[T0][T1][T2][T3]
。
如上所述,tileset的tree结构具有空间连贯性;每个tile有一个完全包含了它本身内容的包围体,同时该包围体也完全包含它的children tiles(如果有的话)的内容。但这并不意味着child tile的包围体要被它parent tile的包围体所包含。比如下面的例子:
地球tile的包围球
地球tile的4个child tile的包围体。child tile的内容完全包含在parent tile的包围体中,但是child tile的包围体并没有,因为它不是紧密适合的。
传送:
3dTile技术研究-开篇
3dTile技术研究-概述
3dTile技术研究-概念详述(1)
3dTile技术研究-概念详述(2)
3dTile技术研究-概念详述(3)