Cesium快速入门9:相机动画与交互

一、让相机瞬间飞到指定地点

有同学问:"我能不能让镜头像坐飞机一样,'嗖'地飞到天安门广场?"

当然可以!Cesium 已经帮我们封装好了 flyTo 方法,只要一行代码就能搞定。

复制代码
viewer.camera.flyTo({
  destination: Cesium.Cartesian3.fromDegrees(116.3914, 39.88, 2000), // 经度、纬度、高度(米)
  orientation: {
    heading: Cesium.Math.toRadians(0),   // 左右朝向:0° 表示正北
    pitch: Cesium.Math.toRadians(-30),   // 俯仰角:负值表示往地面看
    roll: Cesium.Math.toRadians(0),      // 翻滚角:0° 表示不倾斜
  },
  duration: 3,  // 飞行耗时 3 秒
});

运行后,地球会平滑旋转、下降,最后稳稳停在天安门上空,像电影航拍一样,非常酷!

如果你想"点击按钮再飞",只要把这段代码放进按钮的点击事件里即可,完全没问题。


二、用键盘实时控制相机

刚才的"自动飞行"很炫,但有时候我们想自己开"飞机"------

按 W 前进,按 S 后退,按 A 左平移,按 D 右平移,甚至抬头、低头、翻滚,全由键盘说了算。

怎么做?分三步:

  1. 监听键盘事件

  2. 判断按下的是哪个键

  3. 调用相机对应的移动/旋转方法

代码直接摆上来(已加中文注释,方便复制粘贴):

复制代码
// 监听整个页面的按键事件
document.addEventListener('keydown', (event) => {
  // 移动速度 = 当前相机离地高度 ÷ 100,飞得越高动得越快
  const speed = viewer.camera.positionCartographic.height / 100;

  // ============== 平移 ==============
  if (event.code === 'KeyW') {
    viewer.camera.moveForward(speed);   // 沿视线方向前进
  } else if (event.code === 'KeyS') {
    viewer.camera.moveBackward(speed);  // 沿视线方向后退
  } else if (event.code === 'KeyA') {
    viewer.camera.moveLeft(speed);      // 向左平移
  } else if (event.code === 'KeyD') {
    viewer.camera.moveRight(speed);     // 向右平移
  }

  // ============== 旋转视角(左右看) ==============
  else if (event.code === 'KeyQ') {
    viewer.camera.lookLeft(Cesium.Math.toRadians(10));   // 左转 10°
  } else if (event.code === 'KeyE') {
    viewer.camera.lookRight(Cesium.Math.toRadians(10));  // 右转 10°
  }

  // ============== 旋转视角(上下看) ==============
  else if (event.code === 'KeyR') {
    viewer.camera.lookUp(Cesium.Math.toRadians(10));     // 抬头 10°
  } else if (event.code === 'KeyF') {
    viewer.camera.lookDown(Cesium.Math.toRadians(10));   // 低头 10°
  }

  // ============== 翻滚(像飞机做滚筒动作) ==============
  else if (event.code === 'KeyG') {
    viewer.camera.twistLeft(Cesium.Math.toRadians(10));  // 逆时针翻滚 10°
  } else if (event.code === 'KeyH') {
    viewer.camera.twistRight(Cesium.Math.toRadians(10)); // 顺时针翻滚 10°
  }
});

三、实际演示效果

  • 按 W / S:镜头像走路一样前后移动。

  • 按 A / D:左右平移,像螃蟹横着走。

  • 按 Q / E:脑袋左右摇头,视角跟着转。

  • 按 R / F:抬头看天、低头看地。

  • 按 G / H:整个画面像飞机做滚筒飞行动作,逆时针或顺时针旋转。

速度会随高度自动变化:

当你离地面 1000 米时,speed = 10 米/次;

离地面 10000 米时,speed = 100 米/次,

完全不用担心"按烂了键盘还纹丝不动"的尴尬。


四、小结

今天学了两个大招:

  1. 用 flyTo 让相机"航拍"到任意坐标。

  2. 用键盘事件 + 相机方法,手动开"飞机",想怎么飞就怎么飞。

大家先把今天的代码跑起来,熟悉一下手感,我们下次见!

相关推荐
总要学点什么2 天前
第47篇:三维特效-雷达波效果——波纹一圈圈往外推,一半却埋在地下
3d·前端框架·gis·webgl·cesium
八荒启·交互动画8 天前
Web特效025—用 Canvas 2D 做Web特效的定义与边界:这支画笔能做到哪一步
前端·webgl·网页特效·八荒启-交互动画·八荒启
夜郎king9 天前
基于 Cesium + 天地图的三维地理可视化:以“岳麓山名人墓“为例,详解地形夸张、自动环绕与标签碰撞避让
cesium·实景三维·人文历史
Bruce_Liuxiaowei10 天前
网页版 DeepSeek “harness desktop“ WebGL 上下文创建失败排查实录
开发语言·javascript·webgl
像我这样帅的人丶你还14 天前
📱iPhone Duo 开屏动画咋实现的?
javascript·webgl·three.js
夏天要喝冰可乐14 天前
Antigravity + Blender MCP(下):3D 智慧仓储数字孪生进阶实战
前端·webgl·three.js
夏天要喝冰可乐14 天前
Antigravity + Blender MCP(上):打造3D 智慧仓储数字孪生
前端·webgl·three.js
supermapsupport20 天前
SuperMap iClient3D for WebGL 交互式栅格信息查询
webgl·supermap
八荒启·交互动画23 天前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启
八荒启·交互动画23 天前
Web特效019-Web特效的定义与边界核心算法手写一遍:先跑起来,再谈高级效果
前端·webgl·网页特效·八荒启-交互动画·八荒启