一、前言
在上一篇文章中说geometricError 类似一个对象外包球的直径,那boundingVolume 外包范围就能计算外包球的直径,这两个值应该是一样,若这样理解就给大家带来很多误解(那真是罪过啊,误人子弟o(∩_∩)o )。今天就从这两个值的关系来理解3DTile的树结构组织。
首先我们知道3DTile 是一个树的数据结构(分析Replace模式)。
- 父子的boundingVolume的都是一样的,但是geometricError的值不一样。
- 父子的boundingVolume的不一样的,且geometricError的值不一样。
二、 父子的boundingVolume的都是一样
先看一个段数据
"root": {
"boundingVolume": {
"box": [
-0.14458248518394613,
0.19650212276906132,
-0.55261315359229,
1875.0316531509962,
0.0,
0.0,
0.0,
1875.3490874752823,
0.0,
0.0,
0.0,
276.3399779427031
]
},
"children": [
{
"boundingVolume": {
"box": [
-0.14458248518394613,
0.19650212276906132,
-0.55261315359229,
1875.0316531509962,
0.0,
0.0,
0.0,
1875.3490874752823,
0.0,
0.0,
0.0,
276.3399779427031
]
},
"children": [
{
"boundingVolume": {
"box": [
-0.14458248518394613,
0.19650212276906132,
-0.55261315359229,
1875.0316531509962,
0.0,
0.0,
0.0,
1875.3490874752823,
0.0,
0.0,
0.0,
276.3399779427031
]
},
"children": [
],
"content": {
"uri": "./12_770_3347.pnts"
},
"geometricError": 610.8496533793162,
"refine": "REPLACE"
}
],
"content": {
"uri": "./11_385_1673.pnts"
},
"geometricError": 1221.6993067586325,
"refine": "REPLACE"
}
],
"content": {
"uri": "./10_192_836.pnts"
},
"geometricError": 2443.398613517265,
"refine": "REPLACE"
}
如下图:
简单分析:
root、children1和children2 的boundingVolume 大小都一样的,这也是表示content中模型都是同一个范围大小。也是表示同一个区域有不同精细程度的模型显示。
节点 | geometricError | content | 含义 |
---|---|---|---|
root | 2443.398613517265 | ./10_192_836.pnts | 最粗级别的显示 |
children1 | 1221.6993067586325 | ./11_385_1673.pnts | 稍微精细的显示 |
children2 | 610.8496533793162 | ./12_770_3347.pnts | 最精细基本的显示 |
三、父子的boundingVolume的不一样
再看示例数据,下面是children2 和children2的4个子节点。
{
"boundingVolume": {
"box": [
-0.14458248518394613,
0.19650212276906132,
-0.55261315359229,
1875.0316531509962,
0.0,
0.0,
0.0,
1875.3490874752823,
0.0,
0.0,
0.0,
276.3399779427031
]
},
"children": [
{
"boundingVolume": {
"box": [
-0.03427998898069973,
0.050359473046114548,
-0.1388141771560356,
875.0125471503252,
0.0,
0.0,
0.0,
1000.1143360638881,
0.0,
0.0,
0.0,
159.95138723351423
]
},
"children": [],
"content": {
"uri": "./13_1540_6694.pnts"
},
"geometricError": 305.4248266896581,
"refine": "REPLACE"
},
{
"boundingVolume": {
"box": [
-0.029988789936908235,
0.0461619164840954,
-0.12271740886197336,
1000.0604137950561,
0.0,
0.0,
0.0,
750.2189040240137,
0.0,
0.0,
0.0,
116.12710293512848
]
},
"children": [],
"content": {
"uri": "./13_1540_6695.pnts"
},
"geometricError": 305.4248266896581,
"refine": "REPLACE"
},
{
"boundingVolume": {
"box": [
-0.0007599997864602415,
0.003043501422567374,
-0.00614958219984274,
125.05203600201517,
0.0,
0.0,
0.0,
249.97252560917924,
0.0,
0.0,
0.0,
63.62691302749434
]
},
"children": [],
"content": {
"uri": "./13_1541_6694.pnts"
},
"geometricError": 305.4248266896581,
"refine": "REPLACE"
},
{
"boundingVolume": {
"box": [
-0.014034166235433077,
0.0696143076038993,
-0.13873502640339553,
1000.1713563037824,
0.0,
0.0,
0.0,
875.160720297898,
0.0,
0.0,
0.0,
268.88671045802087
]
},
"children": [],
"content": {
"uri": "./13_1541_6695.pnts"
},
"geometricError": 305.4248266896581,
"refine": "REPLACE"
}
],
"content": {
"uri": "./12_770_3347.pnts"
},
"geometricError": 610.8496533793162,
"refine": "REPLACE"
}
关系如下图:
简单分析:
- children2的子节点进行了4叉树切分。就是说children2 的更精细显示用了4个子节点的模型显示。
四、总结
- 通过上面两种方式可以看出geometricError的LOD含义的表达。
- 一个结构完整的3DTile的数据,既有同一个瓦片区域不同LOD的数据,还有瓦片切分的金字塔数据结构表达。
- 大部分3DTile数据中父子geometricError都是2倍,理论上也可以不是2倍。
- 在父子geometricError都是2倍的,有些节点的“content”可以是空的。
PS: 文中若有不正之处欢迎指出。