当前位置: 首页 > news >正文

第4章:CesiumJS 从入门到精通④:上帝之眼——Camera 基础操作与坐标系

本专栏正在连载中,欢迎关注不迷路~阅读时间:约 25 分钟 | 硬核实操篇,建议跟着代码一起敲


写在前面

前面三篇文章我们搭好了环境、理清了架构、拆完了 Viewer 参数。但你有没有发现一个尴尬的事 —— 我们还没正经学过怎么用代码精确控制相机飞到想去的地方

今天这篇文章就是来解决这个问题的。相机系统是 CesiumJS 中使用频率最高的子系统之一,理解它,你就能让地球按照你的剧本转起来

读完本文你会收获:

  1. 搞懂 CesiumJS 中的三种坐标体系:Cartesian3、Cartographic、屏幕坐标
  2. 掌握Cartesian3.fromDegrees()—— 你每天会用 50 次的函数
  3. 彻底理解camera.flyTo()的每一个参数
  4. 学会 heading /pitch/roll 控制相机朝向
  5. 掌握zoomTolookAtviewBoundingSphereflyToBoundingSphere的区别

一、先搞懂坐标系 —— 这是所有 "位置" 的基础

1.1 为什么需要三种坐标系?

CesiumJS 内部有三种不同的坐标表示方式,每一种都有自己的用武之地:

用户输入(经纬度) → Cartesian3(引擎计算) → 屏幕坐标(用户点击) (116.4, 39.9) → (x, y, z) → (px, py)

1.2 三种坐标速查

坐标系Cesium 类型含义什么时候用
地心笛卡尔Cartesian3以地球球心为原点的 (x, y, z) 坐标,单位:米大部分 API 的参数(Entity.position、Camera.destination 等)
地理坐标Cartographic经度 / 纬度 / 高度,单位:弧度 / 弧度 / 米数学计算、插值、地形采样
屏幕坐标Cartesian2浏览器窗口内的像素坐标 (x, y)鼠标事件处理

1.3 坐标互转 —— 你每天都会用

// ① 经纬度(度)→ Cartesian3(最常用!每天写50遍) const position = Cesium.Cartesian3.fromDegrees(116.4074, 39.9042, 1000); // ② Cartesian3 → Cartographic(地理坐标) const cartographic = Cesium.Cartographic.fromCartesian(position); console.log(cartographic.longitude); // 弧度! console.log(cartographic.latitude); // 弧度! // ③ 弧度 ↔ 度 const degrees = Cesium.Math.toDegrees(cartographic.longitude); const radians = Cesium.Math.toRadians(116.4074); // ④ 3D坐标 → 屏幕坐标 const screenPoint = Cesium.SceneTransforms.wgs84ToWindowCoordinates( viewer.scene, position );

⚠️最容易犯的错Cartographic的经纬度单位是弧度,不是度!坐标偏移 90% 都是这里搞混了。

1.4 一张图帮你记住

用户界面 API 参数 内部存储 ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 116.4°E │ ──→ │ fromDeg │ ──→ │ Cartesian3│ │ 39.9°N │ │ rees() │ │ {x, y, z} │ │ 50000m │ └──────────┘ └──────────┘ └──────────┘ │ Cartographic .fromCartesian() │ ┌─────▼─────┐ │ Cartographic│ │ lon(弧度) │ │ lat(弧度) │ │ height(米) │ └─────────────┘

二、Camera API 图谱:六种飞行方式

CesiumJS 提供了六种相机操作方法,按使用频率排列:

方法一句话有动画吗
setView()瞬间跳转到指定位置❌ 瞬移
flyTo()飞行动画到指定位置✅ 平滑飞
zoomTo()缩放视角以包含指定实体 / 数据源
flyToBoundingSphere()飞到包围球
lookAt()盯着某个目标点看,但位置不变
lookAtTransform()在局部参考系中看(模型跟随)

三、flyTo () —— 使用频率 90% 的方法

3.1 完整参数签名

camera.flyTo({ destination : Cartesian3 | Rectangle, // 目标位置 orientation : { // 朝向 heading : 0, pitch : Cesium.Math.toRadians(-45), roll : 0, }, duration : 3, // 飞行秒数 easingFunction : Cesium.EasingFunction.QUADRATIC_IN_OUT, complete : () => { console.log('到了'); }, cancel : () => { console.log('被取消了'); }, });

3.2 最常用的三种调用模式

// 模式①:飞到点(最常用) viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 50000), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-45), }, duration: 3, }); // 模式②:飞到矩形区域(俯瞰中国) viewer.camera.flyTo({ destination: Cesium.Rectangle.fromDegrees(73, 18, 135, 54), duration: 3, }); // 模式③:飞到实体 viewer.flyTo(entity, { duration: 2, offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-30), 5000), });

3.3 常用矩形范围

// 定位中国全境 const china = Cesium.Rectangle.fromDegrees(73, 18, 135, 54); // 定位北京市区 const beijing = Cesium.Rectangle.fromDegrees(116.1, 39.7, 116.6, 40.1);

四、理解 heading /pitch/roll

想象你是一架飞机:

  • heading= 水平方向(左右转)0 = 北,90 = 东,180 = 南,270 = 西
  • pitch= 垂直方向(上下看)0 = 平视,-90 = 俯视地面,+90 = 仰望天空
  • roll= 绕视线旋转
// 上帝视角:垂直向下看 heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-90), // 水平看地平线 heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(0),

五、setView () —— 瞬间跳转

setViewflyTo参数完全一样,区别只有一个:没有动画,直接跳过去

// 瞬间跳转到北京上空 viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 50000), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-45), }, });

适用场景:页面初始化、重置视角、快速切换。


六、其他定位方式

6.1 zoomTo () —— 自动适配视野

// 自动缩放以包含所有 Entity viewer.zoomTo(viewer.entities); // 自动缩放以包含某个数据源 viewer.zoomTo(dataSource);

6.2 lookAt () —— 盯着目标看

// 相机不动,视线锁定目标 const target = Cesium.Cartesian3.fromDegrees(116.4, 39.9, 0); const offset = new Cesium.HeadingPitchRange( Cesium.Math.toRadians(45), Cesium.Math.toRadians(-30), 10000 ); viewer.camera.lookAt(target, offset);

七、缓动函数(EasingFunction)—— 飞行的节奏感

类型效果推荐度
QUADRATIC_IN_OUT慢→快→慢⭐⭐⭐⭐⭐ 默认
CUBIC_IN慢起步⭐⭐⭐
CUBIC_OUT慢停止⭐⭐⭐
BOUNCE_OUT弹跳落地⭐⭐ 趣味
viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 50000), easingFunction: Cesium.EasingFunction.BOUNCE_OUT, duration: 4, });

八、实用技巧

8.1 取消飞行

viewer.camera.cancelFlight();

8.2 飞回默认视角

viewer.camera.flyHome(2);

8.3 获取当前相机经纬度

const pos = viewer.camera.position; const carto = Cesium.Cartographic.fromCartesian(pos); console.log('经度:', Cesium.Math.toDegrees(carto.longitude)); console.log('纬度:', Cesium.Math.toDegrees(carto.latitude));

8.4 限制缩放距离

const controller = viewer.scene.screenSpaceCameraController; controller.minimumZoomDistance = 1000; // 最近 1km controller.maximumZoomDistance = 20000000; // 最远 20000km

九、本篇总结

这一篇我们搞懂了 CesiumJS 的相机系统基础。核心就三件事:

  1. 坐标转换Cartesian3.fromDegrees()是你最常用的一行代码
  2. 飞行方式flyTo()统治 90% 的场景,setView()瞬移、zoomTo()自动适配
  3. 朝向控制:heading = 水平转、pitch = 上下看、roll = 歪头

从下一篇开始,我们进入 CesiumJS 最实用的部分 ——Entity 实体体系。你将学会用几行代码在地球上画出各种漂亮的标记、线条和形状。


课后动手

  1. flyTo让相机依次飞到北京、东京、纽约、伦敦,形成 "世界地标巡礼"
  2. 用不同的easingFunction飞到同一个位置,感受动画差异
  3. Rectangle.fromDegrees俯瞰中国全境
  4. 实现一个按钮,点击取消当前飞行
  5. 获取并打印当前相机的经纬度

📢 下一篇预告

CesiumJS 从入门到精通⑤—— 万物皆实体,Entity API 入门:Point、Billboard、Label、颜色系统、增删改查…… 敬请期待!

http://www.rkmt.cn/news/1470746.html

相关文章:

  • PHP代码依赖注入与测试替身
  • 2026年深圳专利申请与无效律师推荐指南:申请布局到无效宣告 - 本地品牌推荐
  • 从《中国来电显示标准》到代码:手把手教你用Python仿真FSK过零检测全流程(含信号生成与解调对比)
  • AI工具与智能个人整合失效真相(Gartner 2024数据证实:83%用户缺这1个元能力)
  • 【AI志愿填报终极指南】:2024高考季必抢的5大智能工具+3套动态策略模型(教育科技部内部验证版)
  • 从一体化到云化:5G小基站架构演变如何重塑FAPI与nFAPI?
  • Python 自动化脚本实践:用 watchdog 监控文件变化
  • 用C# WinForm从零搭建一个企业级人事管理系统(附完整源码与数据库设计)
  • 零基础吃透网络底层!从输入网址到页面显示,看懂TCP/UDP/HTTP/七层模型
  • 2026年北京工伤律师推荐榜单:5位实力派专业护航劳动者权益 - 本地品牌推荐
  • 告别手动操作:教你用C# + Bartender自动化生成产品标签并导出PDF报告
  • 2026年考大货车驾驶证:驾校选型核心技术要点解析 - 优质品牌商家
  • 告别理论恐惧:用C++ 11手把手实现一个LL(1)预测分析器(附完整源码)
  • 【2025最新】Omnic9.2下载安装教程 专业红外数据分析软件一站式解决方案
  • 2026年泉州管道疏通推荐榜单:5家口碑好实力强的专业服务 - 本地品牌推荐
  • QTT编码技术原理与高维数据压缩实践
  • Veo视频风格迁移私密手册(内部泄露版):包含未文档化的--temporal_weight_decay参数及3种动态衰减策略
  • 投影幕布靠谱品牌,竹者值得信赖吗? - 工业品牌热点
  • Linux基础命令汇总笔记(附常用示例)
  • 2026年现阶段禅城白蜡木家具制造商深度解析:如何甄选实力工厂? - 2026年企业资讯
  • 2026年高三复读机构排名,哪家口碑好 - 工业品牌热点
  • ai辅助开发进阶:借助快马平台智能迭代你的claude桌面应用
  • 基于强化学习的信用卡欺诈检测系统设计与优化
  • 别再傻傻分不清了!用大白话+动图帮你搞懂有限元里的拉格朗日和欧拉描述
  • Photoshop PS 2025保姆级详细安装教程
  • 离散算子学习:结合数值分析与深度学习求解PDE
  • Windows下用VS2019编译CEF官方Demo,并开启离屏渲染(OSR)模式避坑实录
  • 论文党必看:从Word公式到MathType的完整避坑与批量美化指南
  • 别再手动改样式了!用Pycharm+PyQt5的pyrcc5一键管理界面资源(附虚拟环境路径避坑)
  • 实测落地复盘:多模型聚合不是噱头,从开发者日常看清真实使用价值