当前位置: 首页 > 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.cnnetsun.cn/news/2780181.html

相关文章:

  • 2026年WordPress分销功能开发完整指南
  • 别再死记硬背架构图了!用一张外卖订单的‘一生’,带你搞懂单体到微服务的演变
  • QTT编码技术原理与高维数据压缩实践
  • 从社交网络到推荐系统:Node Embeddings实战避坑指南(以Karate Club和MovieLens为例)
  • 告别硬编码!在C#中动态填充Bartender模板数据并导出图片/PDF的几种姿势
  • Coding-Interview-University 零基础刷题通关指南|从算法小白到面试手撕大佬(全流程落地+多解法实战)
  • 《仙娥顾我》小说|下载|txt
  • 如何为Windows系统安装高质量的macOS风格鼠标指针主题
  • UOS统信服务器安全加固实战:从密码策略到SSH超时,手把手配置指南
  • 别再傻傻分不清了!用大白话和一张图讲透有限元里的拉格朗日和欧拉
  • 调味品质检高效预审:IACheck通审Agent版如何修正理化数据修约与书写错误
  • 从手机连网到高速下载:拆解5G双连接(DC)中PCell与PSCell的‘分工协作’实战
  • 别再傻傻分不清了!5G NR里的PCell、SCell、PScell、SpCell到底啥关系?一张图给你讲明白
  • Week 2 -- Day 4:Agent 系统(上)— 工具与 ReAct
  • 拆解一颗芯片的诞生:手把手图解MOSFET制造中的12个关键步骤(附工艺对照表)
  • PowerBuilder 12.5 实战:用自定义可视对象(Custom Visual)快速搞定日期范围查询组件
  • 2024青岛烧烤实测!那些年一起吃串的地方,本地人私藏老牌连锁餐厅
  • 别再死记硬背了!用这5个真实业务场景,彻底搞懂数据库关系代数(附SQL对照)
  • 【2024智能娱乐生产力跃迁】:仅用3类开源AI工具+1套标准化API协议,将内容生产效率提升470%(实测数据)
  • 别再死记硬背数组地址公式了!用Python模拟龙书6.4节习题,彻底搞懂行/列优先存储
  • 给PL/0编译器“打补丁”:手把手教你用C语言实现IF-ELSE和复合运算符
  • 新手友好:在快马平台上从零开始构建你的第一个winhance工具
  • Claude Code多文件实战:跨文件操作和项目管理的最佳实践
  • 【Claude情景规划实战指南】:20年AI架构师亲授5大高阶技巧,避开90%团队踩过的认知陷阱
  • 如何3分钟破解JSXBIN加密文件:Jsxer反编译工具终极指南
  • 新手入门网页开发,用快马AI生成带注释的谷歌邮箱注册页面代码
  • 别再傻傻分不清了!SystemVerilog里logic、reg和wire到底该用哪个?(附代码避坑指南)
  • 探秘近 50 年 ANSI 编码:如何成就多彩终端交互体验?
  • 从零到一:用TensorFlow 2.3和MobileNet构建一个高精度果蔬识别App(附完整代码和数据集)
  • 实战派指南:用Python脚本自动查询LTE频段参数与计算EARFCN