Cesium Vue(三)— 相机配置

1. 坐标系转换

1.1 cesium使用到的坐标系

  1. 屏幕坐标系,二维的笛卡尔坐标系,API => Cartesian2
  2. 地理空间坐标系,WGS-84坐标系, API => Cartographic(经度,维度,高度)
  3. 三维笛卡尔空间直角坐标系,API => Cartesian3

1.2 坐标转换具体实现

  • 角度与弧度的转换
js 复制代码
var radians=Cesium.Math.toRadians(90);
console.log("radians ==> "+radians);
  • 弧度转角度
js 复制代码
var degrees=Cesium.Math.toDegrees(2*Math.PI);
console.log("degrees ==> "+degrees);
  • 将经纬度转成笛卡尔坐标系
js 复制代码
var cartesian3=Cesium.Cartesian3.fromDegrees(
  89.5,//经度
  20.4,//纬度
  100//高度
);
console.log("cartesian3 ==> "+cartesian3);
  • 将笛卡尔坐标系转换为经纬度
js 复制代码
var cartographic=Cesium.Cartographic.fromCartesian(cartesian3);
console.log("cartographic ==> "+cartographic);
//得到结果弧度,转成角度
var longitude=Cesium.Math.toDegrees(cartographic.longitude);
var latitude=Cesium.Math.toDegrees(cartographic.latitude);
console.log("LonLat ==> "+longitude+","+latitude);

2. 设置相机的位置和视角

  • 设置相机位置和视角
js 复制代码
 // 设置相机视角瞬间到达指定位置,角度
  // (116.393428, 39.90923)生成position是天安门的位置
  var position = Cesium.Cartesian3.fromDegrees(116.393428, 39.90923, 100);
  viewer.camera.setView({
    // 指定相机位置
    destination: position,
    // 指定相机视角
    orientation: {
      // 指定相机的朝向,偏航角,相当于 X 角
      heading: Cesium.Math.toRadians(0),
      // 指定相机的俯仰角,0度是竖直向上,-90度是向下  相当于 y 角
      pitch: Cesium.Math.toRadians(-20),
      // 指定相机的滚转角,翻滚角   相当于 z 角
      roll: 0,
    },
  });
  • 设置带相机动画的位置和视角
js 复制代码
// flyto,让相机飞往某个地方
viewer.camera.flyTo({
    destination: position,
    orientation: {
      heading: Cesium.Math.toRadians(0),
      pitch: Cesium.Math.toRadians(-20),
      roll: 0,
    },
});

3. 使用键盘控制相机的位置和视角

js 复制代码
// 通过按键移动相机
  document.addEventListener("keydown", (e) => {
    // console.log(e);
    // 获取相机离地面的高度
    var height = viewer.camera.positionCartographic.height;
    var moveRate = height / 100;
    if (e.key == "w") {
      // 设置相机向前移动
      viewer.camera.moveForward(moveRate);
    } else if (e.key == "s") {
      // 设置相机向后移动
      viewer.camera.moveBackward(moveRate);
    } else if (e.key == "a") {
      // 设置相机向左移动
      viewer.camera.moveLeft(moveRate);
    } else if (e.key == "d") {
      // 设置相机向右移动
      viewer.camera.moveRight(moveRate);
    } else if (e.key == "q") {
      // 设置相机向左旋转相机
      viewer.camera.lookLeft(Cesium.Math.toRadians(0.1));
    } else if (e.key == "e") {
      // 设置相机向右旋转相机
      viewer.camera.lookRight(Cesium.Math.toRadians(0.1));
    } else if (e.key == "r") {
      // 设置相机向上旋转相机
      viewer.camera.lookUp(Cesium.Math.toRadians(0.1));
    } else if (e.key == "f") {
      // 设置相机向下旋转相机
      viewer.camera.lookDown(Cesium.Math.toRadians(0.1));
    } else if (e.key == "g") {
      // 向左逆时针翻滚
      viewer.camera.twistLeft(Cesium.Math.toRadians(0.1));
    } else if (e.key == "h") {
      // 向右顺时针翻滚
      viewer.camera.twistRight(Cesium.Math.toRadians(0.1));
    }
  });
相关推荐
deli00714 分钟前
32K 上下文塞满后,AI 最先忘掉什么?120 轮对话实测
前端
deli0071 小时前
手机拍灯为什么有一条条黑纹?PWM 240Hz 实测
前端
wangruofeng6 小时前
AI Models 1.1.0 发布,查大模型价格、对比模型和找 API 地址
前端·aigc·ai编程
wangruofeng6 小时前
给前端开发者的 100 个设计参考网站
前端·设计
星栈9 小时前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技9 小时前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户479492835691510 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
风骏时光牛马12 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng12 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding13 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js