当前位置: 首页 > 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.jsqmd.com/news/959070/

相关文章:

  • 告别晦涩手册:用Jupiter仿真RISC-V汇编,5分钟搞懂内存小端存储与数据输入
  • 通达信软件常见问题解决:如何判断版本位数与DLL绑定失败的处理
  • 手把手教你用BurpSuite抓取本地HTTP流量(附搜狗浏览器配置避坑指南)
  • 告别串口烧录器:手把手教你为TMS320F28377D DSP实现串口在线升级(Bootloader实战)
  • 软件授权管理新思路:基于D8(YT88)加密狗实现按时间/次数/电脑绑定的灵活控制
  • 生媛标识费用如何?连锁品牌装修费用解析 - 工业品牌热点
  • 旗流形与各向同性子空间的数学结构及应用
  • 2026年深圳专利申请与无效律师推荐指南:申请布局到无效宣告 - 本地品牌推荐
  • 利用快马平台快速生成web自动化测试脚本原型,加速ai测试方案验证
  • 太阳能路灯厂家如何选对服务商?这三点是关键
  • 菲斯曼净水机价格怎么样,哪家好 - mypinpai
  • DSP双工程跳转“鬼打墙”?手把手教你用CCS断点调试理清Bootloader与App的跳转逻辑
  • 实战演练:基于快马平台构建电商用户行为交互式分析看板
  • 从一体化到云化:5G小基站架构演变如何重塑FAPI与nFAPI?
  • AI工具与智能个人整合失效真相(Gartner 2024数据证实:83%用户缺这1个元能力)
  • 2026西南无机涂料厂家评测:成都乳胶漆厂家/成都四川无机涂料厂家/成都四川艺术漆厂家/成都夯土漆厂家/成都无机涂料价格/选择指南 - 优质品牌商家
  • 【AI志愿填报终极指南】:2024高考季必抢的5大智能工具+3套动态策略模型(教育科技部内部验证版)
  • 选择困难症患者,手机上可以装这几种“决策辅助”App
  • WRF-Chem实战:如何为你的区域空气质量模拟定制排放源(以RADM2和CBMZ机制为例)
  • Python 自动化脚本实践:用 watchdog 监控文件变化
  • 从《中国来电显示标准》到代码:手把手教你用Python仿真FSK过零检测全流程(含信号生成与解调对比)
  • 用C# WinForm从零搭建一个企业级人事管理系统(附完整源码与数据库设计)
  • 告别盲调!用Vivado ILA + SDK Debug玩转ZYNQ软硬件协同调试(附AXI监控技巧)
  • 如何快速掌握图表制作:面向新手的Mermaid Live Editor完整教程
  • 零基础吃透网络底层!从输入网址到页面显示,看懂TCP/UDP/HTTP/七层模型
  • 炸裂!AI 编程界的“LSP”诞生,Claude/Cursor/Codex 终于被我打通任督二脉!
  • 企业数据清洗用什么工具好?FineDataLink、Informatica、Talend 三家横评
  • 告别手动操作:教你用C# + Bartender自动化生成产品标签并导出PDF报告
  • 合同纠葛解决推荐哪家?新材略律所性价比高 - 工业品牌热点
  • UOS统信服务器安全加固实战:从密码策略到SSH超时,一篇搞定