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));
    }
  });
相关推荐
京东零售技术1 分钟前
京东小程序JS API仓颉改造实践
前端
老A技术联盟11 分钟前
从小白入门,基于Cursor开发一个前端小程序之Cursor 编程实践与案例分析
前端·小程序
风铃喵游14 分钟前
构建引擎: 打造小程序编译器
前端·小程序·架构
sunbyte19 分钟前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)
前端·javascript·css·vue.js·前端框架·tailwindcss
小飞悟28 分钟前
🎯 什么是模块化?CommonJS 和 ES6 Modules 到底有什么区别?小白也能看懂
前端·javascript·设计
浏览器API调用工程师_Taylor28 分钟前
AOP魔法:一招实现登录弹窗的全局拦截与动态处理
前端·javascript·vue.js
FogLetter29 分钟前
初识图片懒加载:让网页像"懒人"一样聪明加载
前端·javascript
微客鸟窝31 分钟前
一文搞懂NVM管理Node.js:从安装到实战全攻略
前端
归于尽31 分钟前
Cookie、Session、JWT 的前世今生
前端
程序员辉哥32 分钟前
学会在Cursor中使用Rules生成代码后可以躺平了吗?
前端·后端