Skip to content

相机、视锥与观察方式 ​

相机不是一张可以拖动的地图中心点。它包含位置、观察方向、向上方向和视锥(frustum)。同一组气象面在俯视时可能整齐叠合,在低角度观察时却出现交叉与遮挡。相机因此既是导航工具,也是验证三维几何是否正确的工具。

本课需要区分方向、距离和屏幕位置。向量解释前两者,齐次坐标与投影解释三维位置怎样进入画面。

透视相机的观察方向、近远裁剪面与视锥

从站在哪里,到看向哪里 ​

setView 立即设置视图;flyTo 用动画移动;lookAt 则适合围绕一个目标建立观察关系。它们解决不同交互需求。以下代码在目标附近建立观察角度,方位角(heading)与俯仰角(pitch)使用弧度,目标距离(range)使用米。角度描述方向,距离描述相机离目标多远,二者不能混用。

以下是接在第二课初始化之后的功能片段,沿用已经导入的 Cesium 命名空间和已创建的 viewer,省略容器与初始化代码。

js
const target = Cesium.Cartesian3.fromDegrees(114, 22, 0);
viewer.camera.lookAt(
  target,
  new Cesium.HeadingPitchRange(
    Cesium.Math.toRadians(30),
    Cesium.Math.toRadians(-35),
    800000,
  ),
);
// 恢复世界参考系后,可继续常规全球导航。
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);

lookAt 的 heading 从局部北方向向东增加;负 pitch 通常用于从上方向目标俯视。不要把模型姿态、相机姿态和屏幕旋转角混为一谈,它们可能使用不同的参考方向与约定。

视锥决定哪些位置有机会被画出 ​

透视投影(perspective projection)下,近物大、远物小。近裁剪面(near clipping plane)之前和远裁剪面(far clipping plane)之后的对象都不在可见范围内。这两个平面连同侧面围成视锥,表示相机这一刻可能看到的空间。近远面之间的深度精度也不均匀,巨大的距离跨度会让表面相近的几何更难区分。Cesium 有针对大尺度地理场景的处理,但这不代表任意重叠表面都不会闪烁。

相机看不到对象时,除了检查经纬度,还应检查对象是否在相机后方、是否被地球遮挡、尺寸是否小到不足一个像素。单纯增加对象高度可能暂时使其可见,却掩盖坐标或相机错误。

相机实验台EXPERIMENT 03 · CESIUM 1.145.0

相机实验台

改变 heading、pitch 与距离,理解观察空间。

在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放

底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码

此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。

读取源码…

观察任务: 将“Pitch 俯仰”分别调到 −90° 和 −20°,比较俯视与斜视;再改变“Heading 方位”。保持“到目标的距离”不变,观察相机高度读数是否保持不变。

展开解释

到目标的距离不等于相机椭球高,俯仰变化时相机高度也会变化。俯视更适合比较地理分布,斜视更容易看到垂直结构。评估压力面、建筑和地形的相对位置时,应至少检查两种角度,避免单一视角隐藏穿插或偏移。

官方延伸:Camera 相机接口、1.145 Camera 源码。

气象学 · 数学基础 · 地理可视化