Cesium中实现影像贴3Dtiles

Cesium 中我们经常使用的图层服务除了常见的遥感影像,还会包括一些矢量数据(如宗地范围、规划用地、道路信息等),这些图层服务通常经过 ArcGIS Server / GeoServer 之类的服务器渲染、切片供 Cesium 展示。

但在实际应用中会发现,这些图层服务的内容会被 3DTiles 遮盖(特别是渲染大片倾斜数据时),这个时候,如果我们想获取这些图层上面的信息,就必须将上层的 3DTiles 隐藏。如下图所示(没有合适的矢量图层,用 TileCoordinatesImageryProvider 代替)

不贴3DTiles

影像有贴 3DTiles 选项吗?

在原生的 Cesium 中影像是无法设置贴 3DTiles 的

Cesium 的影像为什么没有贴 3DTiles 选项

如果稍微翻一下源码,可以很容易的发现,影像和地形是交给 Globe 对象去管理的,而 3DTilesprimitiveentity 这类物体则是由 Scene 管理。

Viewer 对象中,GlobeScene 是同级别的存在,所以影像和 3DTiles 根本不属于同一套管理体系,Cesium 自然无法提供影像贴 3DTiles 选项。

实现影像贴 3Dtiles

了解了为什么原生 Cesium 无法实现影像贴 3DTiles 的原因,那么解决的方向就明确了。

做法是在 Scene 中创建一个对象管理影像,使得影像可以和 3DTiles 由同一个对象管理。那么怎么做呢?

翻看源码,可以发现在 Globe 中影像和地形实际上是由 QuadtreePrimitive 对象来进行统一管理的。这是一个复杂的渲染四叉树的 Primitive。详细渲染过程参考文章 最复杂的地球皮肤 影像与地形的渲染与下载过程

因此我们只需要将 QuadtreePrimitive 的逻辑抽出来,单独写成一个 Primitive 实现 QuadtreePrimitive 的功能,保留影像操作的部分,并且将地形的部分删除,转而将影像的载体修改为 GroundPrimitive 即可。

简单的效果展示(没有合适的矢量图层,用 TileCoordinatesImageryProvider 代替)

贴3DTiles

实际体验

更多

不要忘记一键三连,栓 Q!


Cesium中实现影像贴3Dtiles
https://www.liaomz.top/2023/04/13/cesium-zhong-shi-xian-ying-xiang-tie-3dtiles/
作者
发布于
2023年4月13日
许可协议