首页 / 实战手册 / 3D 与 Cesium
相机钻到地下,画面只剩一片黑
先看结论
用户按住右键向上拖,视角越过地平线,屏幕突然全黑,再拖几下地球从另一侧翻出来。
现象
倾斜视角时相机高度变为负数,画面出现黑色或地球背面的纹理。 打印相机位置可以确认:
var carto = viewer.camera.positionCartographic;
console.log(Cesium.Math.toDegrees(carto.longitude),
Cesium.Math.toDegrees(carto.latitude),
carto.height);
// 116.39 39.90 -1840.5
高度 -1840.5 说明相机已经在椭球面以下,视锥朝向地心,
自然看不到任何地表瓦片。
原因
ScreenSpaceCameraController 默认开启碰撞检测,会在地表处挡住相机。
但以下几种配置会让它失效:
- 代码里显式设置
enableCollisionDetection = false,常见于复制来的“自由视角”示例。 - 地形开启后,碰撞检测按地形高度判断,而相机已经穿到地形以下的空洞。
flyTo的目标height给成了负数或 0,飞行结束就停在地下。- 把
minimumZoomDistance调成 0,允许相机无限贴近地面。
排查过程
- 在控制台读
viewer.scene.screenSpaceCameraController.enableCollisionDetection,确认不是false。 - 监听
camera.changed,在高度穿越 0 时打断并打印调用栈。 - 搜索项目里的
flyTo与setView,检查 destination 的height字面量。 - 确认地形开关,地形起伏大的区域需要更大的最小距离。
viewer.camera.changed.addEventListener(function () {
var h = viewer.camera.positionCartographic.height;
if (h < 5) {
console.warn('相机高度过低', h);
}
});
viewer.camera.percentageChanged = 0.01;
解决方案
恢复碰撞检测,并给它一个合理的最小距离。倾斜角度也一并限制,避免用户把视线拉到地平面以下。
var controller = viewer.scene.screenSpaceCameraController;
controller.enableCollisionDetection = true;
controller.minimumZoomDistance = 30;
controller.maximumZoomDistance = 20000000;
controller.minimumTrackBallHeight = 10; // 轨道视角的最低高度
// 限制俯仰,防止视线越过地平线
viewer.scene.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(116.391, 39.907, 5000),
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-45),
roll: 0
}
});
飞行跳转时给一个明确的正高度,不要用 0:
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(116.391, 39.907, 1200),
orientation: {
heading: Cesium.Math.toRadians(20),
pitch: Cesium.Math.toRadians(-35),
roll: 0
},
duration: 2.5,
complete: function () {
console.log('落点高度', viewer.camera.positionCartographic.height);
}
});
验证
连续按住右键向上拖动 10 秒,相机高度不应低于 minimumZoomDistance;
滚轮推到最近,画面仍是地表而不是黑色。
在山区点位重复一次飞行,落点高度应大于当地地形高程。
另一个诱因:把 scene.globe.depthTestAgainstTerrain 打开后,
贴地的标签和线会被地形遮挡而消失,看起来像“地下视角”。
这时应检查的是要素高度,而不是相机。
经纬志(2026)。《相机钻到地下,画面只剩一片黑》。https://www.jingweizhi.com/cookbook/cesium-camera-underground.html(访问日期 2026-11-03)。