Cesium中3DTileset网格切片及与棱柱相交获取技术问询
解决Cesium 3DTileset提取相交网格/区域三角形的问题
我之前也碰到过类似的需求,Cesium官方确实没有提供直接从Cesium3DTileset中切片提取子网格的公开API,但可以通过以下几个思路来实现你的需求:
1. 遍历瓦片并做相交检测
Cesium的3DTiles是按瓦片流式加载的,我们可以遍历已加载的瓦片,逐个判断是否和你的棱柱/目标区域相交,再提取对应瓦片的几何数据:
- 首先遍历tileset中已加载的瓦片:
tileset._tiles.forEach(tile => { // 处理每个瓦片 });注意:
_tiles是Cesium的内部属性,不属于公开API,不同版本可能会有变更,使用时需要注意兼容性。 - 对每个瓦片的包围体(比如
tile.boundingSphere或tile.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




