深色模式
相机、视锥与观察方式
相机不是一张可以拖动的地图中心点。它包含位置、观察方向、向上方向和视锥(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 有针对大尺度地理场景的处理,但这不代表任意重叠表面都不会闪烁。
相机看不到对象时,除了检查经纬度,还应检查对象是否在相机后方、是否被地球遮挡、尺寸是否小到不足一个像素。单纯增加对象高度可能暂时使其可见,却掩盖坐标或相机错误。
相机实验台
改变 heading、pitch 与距离,理解观察空间。
在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放
底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码
此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。
读取源码…观察任务: 将“Pitch 俯仰”分别调到 −90° 和 −20°,比较俯视与斜视;再改变“Heading 方位”。保持“到目标的距离”不变,观察相机高度读数是否保持不变。
展开解释
到目标的距离不等于相机椭球高,俯仰变化时相机高度也会变化。俯视更适合比较地理分布,斜视更容易看到垂直结构。评估压力面、建筑和地形的相对位置时,应至少检查两种角度,避免单一视角隐藏穿插或偏移。
官方延伸:Camera 相机接口、1.145 Camera 源码。