Cesium 相机系统

Cesium 的相机系统是其 3D 地球渲染引擎的重要组成部分,它控制用户在虚拟地球上的视图和交互体验。Cesium 的相机系统具备灵活性和强大的功能,允许开发者自定义视图、导航和交互方式。以下是 Cesium 相机系统的主要特点和功能:


1. 相机的基本概念

在 Cesium 中,相机表示为一个对象,包含位置、方向和视野范围等属性。相机的核心属性包括:

  • 位置(position):相机在世界坐标系中的位置,通常以 Cartesian3 表示。
  • 方向(direction):相机的朝向,即相机镜头的指向。
  • 上方向(up):定义相机的"上"方向。
  • 右方向(right):定义相机的"右"方向,通常与方向和上方向正交。

相机的这些方向属性决定了相机的视角和观察范围。


2. 视图控制功能

Cesium 提供了一组函数,用于控制相机视图的切换和动画:

  • 设置视图(setView)

    javascript 复制代码
    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)

    javascript 复制代码
    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 支持为相机视图添加限制,以防止用户查看超出指定范围的区域:

  • 范围限制

    javascript 复制代码
    camera.constrainedAxis = Cesium.Cartesian3.UNIT_Z; // 限制相机只能绕 Z 轴旋转
  • 矩形范围约束

    javascript 复制代码
    camera.lookAtRectangle(Cesium.Rectangle.fromDegrees(west, south, east, north));

4. 事件监听

Cesium 支持监听用户与相机交互的事件,例如鼠标滚轮缩放、拖动地图等。主要的事件有:

  • 鼠标操作事件 :通过 ScreenSpaceEventHandler 实现。

    javascript 复制代码
    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 属性设置:

    javascript 复制代码
    viewer.camera.frustum.fov = Cesium.Math.toRadians(60); // 设置为60度
  • 视距范围(Near/Far Clipping Planes)
    控制相机视锥的近剪裁面和远剪裁面:

    javascript 复制代码
    viewer.camera.frustum.near = 1.0; // 最小可见距离
    viewer.camera.frustum.far = 5000000.0; // 最大可见距离

6. 自由视角与锁定目标

  • 自由视角:用户可以通过鼠标或触摸手势自由调整相机。

  • 锁定目标 :使用 lookAt 方法使相机聚焦在特定目标上:

    javascript 复制代码
    var target = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
    viewer.camera.lookAt(target, new Cesium.Cartesian3(0, 0, 1000)); // 锁定目标,设置偏移量

7. 第三人称/第一人称视角

Cesium 支持模拟第三人称(鸟瞰)和第一人称(地面)视角切换:

  • 第三人称视角:通常使用较高的视距和倾斜角。

  • 第一人称视角:

    javascript 复制代码
    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 的相机系统功能丰富,可满足从简单的视图控制到复杂的交互和动画效果等各种需求。

相关推荐
你怎么知道我是队长8 分钟前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
名字还没想好☜1 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司1 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
心中有国也有家2 小时前
AtomGit Flutter 鸿蒙客户端:ModalBottomSheet 实战
android·javascript·学习·flutter·华为·harmonyos
仙人球部落4 小时前
-python-LangGraph框架(3-31-LangGraph 「合并式状态管理」的原理与实践)
开发语言·javascript·python
sunfdf5 小时前
Next.js 新手从零部署到首跑实战指南
开发语言·javascript·ecmascript
SmartBoyW5 小时前
前端死磕:一文彻底搞懂 JS 事件循环 (Event Loop) 与宏微任务
前端·javascript
mONESY6 小时前
基于MCP协议搭建全链路智能Agent:地图检索+浏览器自动化+本地文件操控实战
javascript
研☆香7 小时前
闭包实战避坑指南
javascript
你怎么知道我是队长7 小时前
JavaScript 的控制语句介绍
开发语言·javascript·ecmascript