Cesium 的相机系统是其 3D 地球渲染引擎的重要组成部分,它控制用户在虚拟地球上的视图和交互体验。Cesium 的相机系统具备灵活性和强大的功能,允许开发者自定义视图、导航和交互方式。以下是 Cesium 相机系统的主要特点和功能:
1. 相机的基本概念
在 Cesium 中,相机表示为一个对象,包含位置、方向和视野范围等属性。相机的核心属性包括:
- 位置(position):相机在世界坐标系中的位置,通常以 Cartesian3 表示。
- 方向(direction):相机的朝向,即相机镜头的指向。
- 上方向(up):定义相机的“上”方向。
- 右方向(right):定义相机的“右”方向,通常与方向和上方向正交。
相机的这些方向属性决定了相机的视角和观察范围。
2. 视图控制功能
Cesium 提供了一组函数,用于控制相机视图的切换和动画:
-
设置视图(setView):
viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height), orientation: { heading: Cesium.Math.toRadians(heading), // 朝向(方位角) pitch: Cesium.Math.toRadians(pitch), // 倾斜角 roll: Cesium.Math.toRadians(roll) // 旋转角 } });
用于直接跳转到指定视图。
-
飞行到视图(flyTo):
viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height), duration: 5, // 飞行时间 orientation: { heading: Cesium.Math.toRadians(heading), pitch: Cesium.Math.toRadians(pitch), roll: Cesium.Math.toRadians(roll) } });
为用户提供平滑的动画过渡效果。
-
缩放和倾斜:
camera.zoomIn(amount)
:放大视图。camera.zoomOut(amount)
:缩小视图。- 通过调整 pitch 实现视角倾斜。
3. 相机限制
Cesium 支持为相机视图添加限制,以防止用户查看超出指定范围的区域:
- 范围限制:
camera.constrainedAxis = Cesium.Cartesian3.UNIT_Z; // 限制相机只能绕 Z 轴旋转
- 矩形范围约束:
camera.lookAtRectangle(Cesium.Rectangle.fromDegrees(west, south, east, north));
4. 事件监听
Cesium 支持监听用户与相机交互的事件,例如鼠标滚轮缩放、拖动地图等。主要的事件有:
- 鼠标操作事件:通过
ScreenSpaceEventHandler
实现。var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas); handler.setInputAction(function (movement) { var cartesian = viewer.camera.pickEllipsoid(movement.endPosition); console.log(cartesian); }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
5. 相机视锥
相机的视锥决定了视图中显示的内容。主要参数包括:
- 视锥角(Field of View, FOV):
相机的视锥角可以通过camera.frustum
属性设置:viewer.camera.frustum.fov = Cesium.Math.toRadians(60); // 设置为60度
- 视距范围(Near/Far Clipping Planes):
控制相机视锥的近剪裁面和远剪裁面:viewer.camera.frustum.near = 1.0; // 最小可见距离 viewer.camera.frustum.far = 5000000.0; // 最大可见距离
6. 自由视角与锁定目标
- 自由视角:用户可以通过鼠标或触摸手势自由调整相机。
- 锁定目标:使用
lookAt
方法使相机聚焦在特定目标上:var target = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); viewer.camera.lookAt(target, new Cesium.Cartesian3(0, 0, 1000)); // 锁定目标,设置偏移量
7. 第三人称/第一人称视角
Cesium 支持模拟第三人称(鸟瞰)和第一人称(地面)视角切换:
- 第三人称视角:通常使用较高的视距和倾斜角。
- 第一人称视角:
viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-90), roll: Cesium.Math.toRadians(0) } });
Cesium 的相机系统功能丰富,可满足从简单的视图控制到复杂的交互和动画效果等各种需求。