上篇:3dTile技术研究-概述
Tiles由元数据构成,这些元数据:用来判定一个tile是否需要渲染、引用可渲染的具体内容和包含所有children tiles的数组。
将Tiles构造为合并了详细层次结构(HLOD)的树,以便在运行时客户端实现需要确定一个tile是否足够详细以进行渲染,以及是否紧接着由较高分辨率的children tiles细化。一个实现将考虑最大允许的屏幕空间误差(SSE),该误差以像素为单位。
一个tile的geometric error定义了它的选择度量。这个值是非负数,它指定tile源几何图形简化显示的误差(以米为单位)。root tile是源几何图形的最简化版本,其几何误差最大。然后,每个连续级别的子级将具有比其父级低的几何误差,并且叶子tile的几何误差为0或接近0。
在客户端实现中, geometric error用来和其他屏幕空间度量(如tile和相机的距离、屏幕尺寸、分辨率)一起计算引入的SSE,决定这个tile是否需要渲染而它的children不需要。如果引入的SSE超出了最大允许限值,那么该tile需要被细化:考虑渲染它的children。
geometric error是根据诸如点密度,以米为单位的tile尺寸或该tile特有的其他因素之类的度量标准制定的。通常,较高的geometric error意味着将更积极地细化tile,并且将更快地加载和渲染children tiles。
参考3DTile 的geometricError含义
更通俗的说就是geometric error用来和其他一些因素一起计算SSE,判断其与最大SSE的大小来决定当前tile是否被渲染以及是否需要被其更详细的的children细化,即渲染它children。
Refinement 决定了 当更高分辨率的children被选择渲染时,它的较低分辨率的parent tile的渲染行为的机制。允许的refinement types是 replacement ("REPLACE"
) 和 additive ("ADD"
)。如果一个tile的refinement type是"REPLACE"
,那就意味着它的children tile以替换parent tile的方式被渲染,也就是parent tile不再被渲染。如果一个tile的refinement type是"ADD"
,那就意味着除了该tile之外,它的children也要被渲染。
一个tileset可以只用"REPLACE"
类型的refinement,也可以只用"ADD"
类型的refinement,或者"REPLACE"
和"ADD"
类型的组合。
root tile必须要有refinement type;同时对于其它tile来说,refinement type是可选项,如果被忽略了,那么就继承parent的。
如果tile使用了
"REPLACE"
类型的refinement,当需要细化它时,就渲染它的children来替换它。
Parent Tile Refined 如果tile使用了
"ADD"
类型的refinement,当需要细化它时,就同时渲染它和它的children。
Parent Tile Refined
包围体定义了包围tile或tile内容的空间范围。为了支持各种数据集的紧密拟合体积,例如规则划分的地形,未与纬度或经度线对齐的城市或任意点云,包围体类型包括定OBB包围盒,包围球和地理区域(由最小和最大纬度,经度和高度定义)。
Bounding box | Bounding sphere | Bounding region |
---|---|---|
boundingVolume.region
属性是使用经度、纬度、高度定义包围地理区域的一个6个数值元素的数组,元素顺序是[west, south, east, north, minimum height, maximum height]
。经度和纬度是在EPSG 4979 定义的 WGS 84基准中,且是弧度表示。高度是以米为单位标识在WGS 84 ellipsoid的上方还是下方。
"boundingVolume": {
"region": [
-1.3197004795898053,
0.6988582109,
-1.3196595204101946,
0.6988897891,
0,
20
]
}
boundingVolume.box
属性是一个12个数值元素的数组,它定义了一个在3-axis(x,y,z)的、Z-UP的笛卡尔右手坐标系中的OBB包围盒。前3个元素定义了包围盒中心的x,y,z坐标;接下来的3个元素(索引是3、4、5)x轴的方向和半轴长;再接下来的3个元素(索引是6、7、8)定义了y轴方向和半轴长;最后的3个元素(索引是9、10、11)定义了z轴的方向和半轴长。
"boundingVolume": {
"box": [
0, 0, 10,
100, 0, 0,
0, 100, 0,
0, 0, 10
]
}
boundingVolume.sphere
属性是一个4个数值元素的数组,它定义了包围球。前3个元素定义了在Z-UP的3-axis(x,y,z)的笛卡尔右手坐标系中的包围球中心点。最后的一个元素(索引是3)定义了米为单位的球半径。
"boundingVolume": {
"sphere": [
0,
0,
10,
141.4214
]
}
这里频繁的出现了OBB包围盒、Z-UP的概念,可参考我的另外两篇博客(直接点外链即可跳转)。
对于不同领域的数据可以使用不同的包围体,对于BIM行业来说OBB包围盒可能更适用一些。
tile的viewerRequestVolume
可以用在组合的异构模型中,也可以用和external tilesets一起使用。
下面的示例包含一个b3dm
的建筑tile和在该建筑中的一个点云tile。点云tile的包围体是一个半径为1.25
的包围球,同时它有一个更大半径(15
)的可视请求体(viewerRequestVolume
)。由于点云tile的geometricError
是0,它总是需要被渲染的,包括初始请求时也是这样,当然前提是相机在定义的可视请求体(viewerRequestVolume
)中的情况下。
{
"children": [{
"transform": [
4.843178171884396, 1.2424271388626869, 0, 0,
-0.7993325488216595, 3.1159251367235608, 3.8278032889280675, 0,
0.9511533376784163, -3.7077466670407433, 3.2168186118075526, 0,
1215001.7612985559, -4736269.697480114, 4081650.708604793, 1
],
"boundingVolume": {
"box": [
0, 0, 6.701,
3.738, 0, 0,
0, 3.72, 0,
0, 0, 13.402
]
},
"geometricError": 32,
"content": {
"uri": "building.b3dm"
}
}, {
"transform": [
0.968635634376879, 0.24848542777253732, 0, 0,
-0.15986650990768783, 0.6231850279035362, 0.7655606573007809, 0,
0.19023066741520941, -0.7415493329385225, 0.6433637229384295, 0,
1215002.0371330238, -4736270.772726648, 4081651.6414821907, 1
],
"viewerRequestVolume": {
"sphere": [0, 0, 0, 15]
},
"boundingVolume": {
"sphere": [0, 0, 0, 1.25]
},
"geometricError": 0,
"content": {
"uri": "points.pnts"
}
}]
}
想了解更多的可视请求体信息, 参考 sample tileset 和 demo video。
可视请求体相当于提供了一种更灵活的控制目标对象可见性的方法,可视具体场景灵活使用。
传送:
3dTile技术研究-开篇
3dTile技术研究-概述