Cesium如何实现半椭球体贴地绘制,解决地形区域半椭球下沉问题
Cesium地形场景半椭球体埋入地下问题修复
根因说明
- 你代码中锚点高度设置为WGS84椭球面的0米,而目标经纬度对应位置存在地形海拔,锚点本身就位于真实地表下方,直接生成椭球体自然会有大部分处于地下
- Cesium原生
Entity.ellipsoid配置不支持heightReference和clampToGround属性,你注释的两行配置对椭球体实体完全不生效,添加后也无法实现贴地效果
修复方案
先采样目标点的实际地形高程,将椭球体锚点的高度设置为对应地形高程即可解决大部分场景的问题,修复后代码如下:
var viewer = new Cesium.Viewer("cesiumContainer", { terrainProvider: Cesium.createWorldTerrain(), }); viewer.scene.globe.depthTestAgainstTerrain = true; viewer.scene.screenSpaceCameraController.enableCollisionDetection = false; var radiusX = 720; var radiusY = 720; var radiusZ = 600; // 向上方向的半径 const targetLon = 82.88827; const targetLat = 39.50256; // 采样目标点最高精度的地形高程 Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, [ Cesium.Cartographic.fromDegrees(targetLon, targetLat) ]).then((samples) => { // 拿到实际地形高度后再创建椭球体 const terrainHeight = samples[0].height; const entityPosition = Cesium.Cartesian3.fromDegrees(targetLon, targetLat, terrainHeight); viewer.scene.primitives.add(new Cesium.DebugModelMatrixPrimitive({ modelMatrix : Cesium.Transforms.eastNorthUpToFixedFrame(entityPosition), length : radiusZ, width : 1.0 })); const entiti_ellipsoid = viewer.entities.add({ position: entityPosition, ellipsoid: { radii: new Cesium.Cartesian3(radiusX, radiusY, radiusZ), maximumCone: Cesium.Math.PI_OVER_TWO, material: Cesium.Color.fromRandom({ alpha: 0.5 }), }, }); viewer.zoomTo(entiti_ellipsoid); });
进阶优化
如果需要实现半椭球体完全贴合起伏地形(边缘也不会被高低起伏的地形遮挡/穿模),可以改用自定义Primitive,通过着色器读取地形深度数据裁剪椭球体的地下部分,或使用GroundPrimitive配合自定义体积几何体实现。
你问题中提到的异常运行效果如下图:
内容的提问来源于stack exchange,提问作者Rhiya
相关产品推荐
相关产品推荐

