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. 用键盘事件 + 相机方法,手动开"飞机",想怎么飞就怎么飞。

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

相关推荐
你们瞎搞1 天前
Cesium加载20GB航测影像.tif
前端·cesium·gdal·地图切片
光影少年2 天前
三维前端需要会哪些东西
前端·webgl
闲云一鹤2 天前
Cesium 使用 Turf 实现坐标点移动(偏移)
前端·gis·cesium
nnsix2 天前
Unity WebGL jslib 通信时,传入字符串,变成数值 问题
webgl
二狗哈3 天前
Cesium快速入门34:3dTile高级样式设置
前端·javascript·算法·3d·webgl·cesium·地图可视化
AlanHou3 天前
Three.js:Web 最重要的 3D 渲染引擎的技术综述
前端·webgl·three.js
二狗哈4 天前
Cesium快速入门33:tile3d设置样式
3d·状态模式·webgl·cesium·地图可视化
Horizon3D4 天前
Cesium大气散射+全球体积云效果
webgl·可视化·cesium效果
EliseL4 天前
SuperMap iClient3D for WebGL如何加载iDesktopX 场景美化绘制资产
3d·webgl·三维
啊西:5 天前
SuperMap iClient3D for WebGL平面场景实现绘制任意面进行GPU空间查询
平面·3d·webgl