Cesium中Entity(点)3D模式不显示及Columbus模式海拔异常问题
问题分析与解决方案
1. 3D模式下点被隐藏的问题
你设置了cesiumViewer.scene.globe.depthTestAgainstTerrain = true,这个属性会让场景里的实体和地形做深度测试——简单说就是如果地形的像素比你的点更靠近相机,点就会被地形挡住。
你的点实体默认开启了depthTest属性(值为true),再加上地形深度测试的开关打开,要是你的点高度(1000米)低于当前视角下地形的实际海拔(比如某些高精度地形区域的海拔可能超过1000米,或者相机角度刚好让地形挡住了点),就会出现点被隐藏的情况。
解决办法:
- 关闭点的深度测试:在点的配置里加一行
depthTest: false,这样点会始终显示在地形上面,不受地形深度测试的影响:var debris = cesiumViewer.entities.add({ position : { value : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 1000), referenceFrame : Cesium.ReferenceFrame.FIXED }, point : { color : Cesium.Color.YELLOW, pixelSize : 6, depthTest: false // 添加这一行 } }); - 调高点的海拔:如果想保留深度测试,可以试着把点的高度设得更高,确保它超过所在位置的地形海拔。
- 关闭地形深度测试:要是你不需要其他实体和地形做深度测试,直接删掉
cesiumViewer.scene.globe.depthTestAgainstTerrain = true这行代码就行。
2. Columbus模式下点海拔显示为0的问题
Columbus模式(也就是2.5D视图)是把地球投影成平面的,默认情况下,实体的高度信息可能不会被直观渲染,或者Cesium会自动把实体贴地显示。这是因为你没明确指定位置的heightReference属性,Cesium默认用了CLAMP_TO_GROUND(贴地)的行为。
解决办法:
- 明确设置高度参考系:在position配置里加
heightReference: Cesium.HeightReference.ABSOLUTE,告诉Cesium用绝对高度(相对于WGS84椭球体的高度):var debris = cesiumViewer.entities.add({ position : { value : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883, 1000), referenceFrame : Cesium.ReferenceFrame.FIXED, heightReference: Cesium.HeightReference.ABSOLUTE // 添加这一行 }, point : { color : Cesium.Color.YELLOW, pixelSize : 6, depthTest: false // 可选,解决3D模式的问题 } }); - 调整视角验证高度:Columbus模式下高度会以“凸起”的形式显示在平面上,你可以调整相机从侧面观察,就能看到点的高度了。如果还是不明显,也可以用
billboard实体代替point,它在Columbus模式下的高度表现会更直观。
另外提个小细节:Cesium.ReferenceFrame.FIXED是默认的参考系,其实可以省略不写,代码会更简洁。
内容的提问来源于stack exchange,提问作者Leeloo




