Cesium中如何获取三维实体与地面交线的点集
获取Cesium中实体与地面的交线点集合
问题
场景中存在一个圆锥实体,与地面相交形成圆形交线,如何获取该交线的点集合?若实体为更复杂的形状,该方法是否依然适用?

示例代码
const viewer = new Cesium.Viewer("cesiumContainer"); viewer.scene.globe.depthTestAgainstTerrain = true; const coneHeight = 5e6; const bottomRadius = 2e6; const position = Cesium.Cartesian3.fromDegrees( -117.16, 32.71, coneHeight / 4 ); const coneEntity = viewer.entities.add({ position: position, heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND, cylinder: { length: coneHeight, topRadius: 0, bottomRadius: bottomRadius, material: Cesium.Color.RED.withAlpha(0.7), outline: true, outlineColor: Cesium.Color.BLACK } });
解决方案
1. 圆锥交线的点集合获取
对于圆锥这类规则几何体,无需复杂检测,直接通过几何计算生成点集:
- 基于圆锥中心位置和底部半径,按固定角度步长(比如5度)生成环绕中心的偏移点。
- 将这些偏移点转换为世界坐标后,投影到地面(WGS84椭球面),得到交线的点集合。
实现代码:
// 生成圆锥与地面的交线点集合 function getConeGroundIntersection(coneEntity, angleStep = 5) { const currentTime = Cesium.JulianDate.now(); const conePos = coneEntity.position.getValue(currentTime); const radius = coneEntity.cylinder.bottomRadius.getValue(); const ellipsoid = viewer.scene.globe.ellipsoid; const points = []; // 按角度步长生成圆周上的点 for (let angle = 0; angle < 360; angle += angleStep) { const rad = Cesium.Math.toRadians(angle); // 计算平面内的偏移量 const offset = new Cesium.Cartesian3( radius * Math.cos(rad), radius * Math.sin(rad), 0 ); // 转换为世界坐标 const enuMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(conePos); const worldPoint = Cesium.Matrix4.multiplyByPoint(enuMatrix, offset, new Cesium.Cartesian3()); // 投影到地面 const cartographic = ellipsoid.cartesianToCartographic(worldPoint); cartographic.height = 0; const groundPoint = ellipsoid.cartographicToCartesian(cartographic); points.push(groundPoint); } // 闭合曲线,添加第一个点到末尾 points.push(points[0]); return points; } // 使用示例:生成并显示交线 const intersectionPoints = getConeGroundIntersection(coneEntity); viewer.entities.add({ polyline: { positions: intersectionPoints, width: 4, material: Cesium.Color.BLUE } });
2. 复杂形状的交线处理
如果是自定义模型、不规则拉伸体这类复杂实体,几何推导不再适用,需要用射线相交检测:
- 先获取复杂实体的表面三角网格数据(通过Cesium模型的primitive访问几何信息)。
- 对网格的每条边或每个三角形,发射射线与地面(WGS84椭球面)计算交点。
- 收集所有交点后,去重、排序,形成连续的交线点集。
注意:这种方法实现难度高,且复杂模型的网格数量大时,会有性能损耗,需要做优化(比如只检测可能与地面相交的部分网格)。
内容的提问来源于stack exchange,提问作者Keei
相关产品推荐
相关产品推荐

