You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Cesium中3DTileset网格切片及与棱柱相交获取技术问询

解决Cesium 3DTileset提取相交网格/区域三角形的问题

我之前也碰到过类似的需求,Cesium官方确实没有提供直接从Cesium3DTileset中切片提取子网格的公开API,但可以通过以下几个思路来实现你的需求:

1. 遍历瓦片并做相交检测

Cesium的3DTiles是按瓦片流式加载的,我们可以遍历已加载的瓦片,逐个判断是否和你的棱柱/目标区域相交,再提取对应瓦片的几何数据:

  • 首先遍历tileset中已加载的瓦片:
    tileset._tiles.forEach(tile => {
      // 处理每个瓦片
    });
    

    注意:_tiles是Cesium的内部属性,不属于公开API,不同版本可能会有变更,使用时需要注意兼容性。

  • 对每个瓦片的包围体(比如tile.boundingSpheretile.boundingVolume)和你的棱柱做相交检测,可以用Cesium提供的Cesium.IntersectionTests工具类,或者自己实现棱柱与包围体的相交逻辑。
  • 对于判定为相交的瓦片,获取其内部的几何实例数据:
    const geometryInstances = tile.content._model?._primitive?._geometryInstances;
    if (geometryInstances) {
      // 遍历几何实例,提取顶点、索引数据
      geometryInstances.forEach(instance => {
        const attributes = instance.geometry.attributes;
        const positions = attributes.position.values; // 顶点坐标数组
        const indices = instance.geometry.indices.values; // 三角形索引数组
        // 这里可以根据棱柱范围筛选出符合条件的三角形
      });
    }
    
    从这些数组中,你可以根据棱柱的边界,计算每个三角形是否在棱柱内,从而提取目标网格。

2. 针对点周围区域的提取

如果你的需求是获取某个点周围的三角形,可以结合Cesium的拾取功能:

  • 使用viewer.scene.drillPick(position)获取该点位置上所有相交的图元,然后从图元中提取几何数据:
    const picks = viewer.scene.drillPick(Cesium.Cartesian3.fromDegrees(lon, lat, height));
    picks.forEach(pick => {
      const primitive = pick.primitive;
      const geometryInstances = primitive._geometryInstances;
      // 后续提取顶点、索引并筛选距离点较近的三角形
    });
    
  • 计算每个三角形的重心到目标点的距离,筛选出在范围内的三角形即可。

关于官方文档

Cesium官方文档目前确实没有专门针对3DTileset提取子网格的章节,因为3DTiles的核心设计目标是高效的流式渲染,而非直接的几何数据提取操作。上述方法都是基于对Cesium内部实现的探索来实现的。

内容的提问来源于stack exchange,提问作者Eran

火山引擎 最新活动