3DTile中的geometricError和boundingVolume

一、前言

上一篇文章中说geometricError 类似一个对象外包球的直径,那boundingVolume 外包范围就能计算外包球的直径,这两个值应该是一样,若这样理解就给大家带来很多误解(那真是罪过啊,误人子弟o(∩_∩)o )。今天就从这两个值的关系来理解3DTile的树结构组织。

首先我们知道3DTile 是一个树的数据结构(分析Replace模式)。

  1. 父子的boundingVolume的都是一样的,但是geometricError的值不一样。
  2. 父子的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中模型都是同一个范围大小。也是表示同一个区域有不同精细程度的模型显示。

节点geometricErrorcontent含义
root2443.398613517265./10_192_836.pnts最粗级别的显示
children11221.6993067586325./11_385_1673.pnts稍微精细的显示
children2610.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个子节点的模型显示。

四、总结

  1. 通过上面两种方式可以看出geometricError的LOD含义的表达。
  2. 一个结构完整的3DTile的数据,既有同一个瓦片区域不同LOD的数据,还有瓦片切分的金字塔数据结构表达。
  3. 大部分3DTile数据中父子geometricError都是2倍,理论上也可以不是2倍。
  4. 在父子geometricError都是2倍的,有些节点的“content”可以是空的。

PS: 文中若有不正之处欢迎指出。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium和Three.js是两种流行的3D图形库,它们可以结合使用来加载和渲染3D Tile数据。 首先,我们需要了解3D Tile是什么。3D Tile是一种开放标准的3D地理空间数据格式,它使用了网格化的数据结构,可以将大规模的地理空间数据以图块(Tiles)的形式进行存储、传输和渲染。它支持以地理坐标系为基础的渲染和空间分析,可以用于展示城市模型、地形数据、空间环境等。 要在Cesium加载和渲染3D Tile数据,我们可以使用Cesium的Tileset类。Tileset类能够处理3D Tile数据集,并根据视口和细节级别动态加载和渲染图块。我们可以使用Cesium的Viewer类创建一个窗口,然后使用Tileset类加载3D Tile数据集,调用其show方法将其显示在场景。 而要结合Three.js来进行渲染,我们可以通过Cesium提供的API将3D Tile数据转换为Three.js可识别的模型格式,如glTF或Collada。然后,我们可以使用Three.js的Loader类加载这些模型,并通过设置材质、光照等参数来实现渲染效果。最后,我们可以将加载后的模型添加到Three.js的场景,与其他Three.js的元素一起进行渲染和交互操作。 总而言之,结合Cesium和Three.js来加载和渲染3D Tile数据,可以借助Cesium的Tileset类加载和管理3D Tile数据集,然后将其转换为Three.js可识别的模型格式,使用Three.js的Loader类加载并进行渲染,最后将加载后的模型添加到Three.js的场景进行展示。这样,我们可以充分利用Cesium和Three.js的优势,实现更加丰富和高效的3D地理空间数据的加载和渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值