You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:37:37