Cesium实践(3)——坐标系与相机系统


前言

本文介绍Cesium世界中的坐标系统,Cesium的坐标系分三种:屏幕坐标、笛卡尔空间直角坐标、地理坐标,在得知目标的坐标后,即可使用相机系统对目标进行定位或进行相机交互。


Cesium 坐标系

屏幕坐标系

屏幕坐标系是一个是平面直角坐标系,即二维笛卡尔坐标系,屏幕左上角为原点(0,0),单位为像素值,屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正。构造函数为 new Cesium.Cartesian2(x, y)

空间直角坐标系

以椭球的中心为原点,建立三条两两垂直的数轴构成的坐标系。由于在计算机中不方便使用经纬度进行绘图,一般会将坐标系转换为笛卡尔坐标系。构造函数为 new Cesium.Cartesian3(x, y, z)

WGS-84坐标系

World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统,坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH (国际时间服务机构)1984.O定义的协议地球极(CTP)方向,X轴指向BIH 1984.0的零子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系。我们平常手机上的指南针显示的经纬度就是这个坐标系下当前的坐标,进度范围[-180,180],纬度范围[-90,90]。

WGS84坐标系包括构造函数为 new Cesium.Cartographic(x,y,z),注意参数皆为弧度制

在这里插入图片描述

坐标系转换

角度与弧度互转

    // 角度转弧度
   const radians = Cesium.Math.toRadians(45.0);
    console.log('角度45.0转弧度======', radians);
    // 弧度转角度
    const degrees = Cesium.Math.toDegrees(1/4 * Math.PI);
    console.log('弧度 1/4 Π 转角度======', degrees);

在这里插入图片描述

84坐标转笛卡尔空间坐标

    // 传经纬度、高
    const cartesian3_1 = Cesium.Cartesian3.fromDegrees(116, 40.4,100);
    // 传经纬度数组
    const cartesian3_2 = Cesium.Cartesian3.fromDegreesArray([116, 40.4, 117,39.4]);
    // 传经纬度、高数组
    const cartesian3_3 = Cesium.Cartesian3.fromDegreesArrayHeights([116, 40.4,100, 117, 39.4, 200]);
    console.log(cartesian3_1);
    console.log(cartesian3_2);
    console.log(cartesian3_3);

在这里插入图片描述
使用 fromRadiansfromRadiansArrayfromRadiansArrayHeights 同理,可将弧度制的84坐标转换为笛卡尔空间坐标。

笛卡尔空间坐标转84坐标

	// 将笛卡尔坐标转84坐标(弧度制)
    const cartographic = Cesium.Cartographic.fromCartesian(cartesian3_1);
    console.log('输入笛卡尔坐标===', cartesian3_1);
    console.log('转换后84坐标(弧度)===', cartographic);

在这里插入图片描述

屏幕坐标转笛卡尔空间坐标

为了防止不必要的性能消耗,cesium为不同的场景提供了不同的转换方法

  • 只考虑球面

使用场景参考:Cesium地图中显示鼠标经纬度

const cartesian3 = Cesium.viewer.scene.pickEllipsoid(cartesian2)
  • 考虑球面、地形,不考虑三维模型

const cartesian3 = Cesium.viewer.scene.globe.pick(
	viewer.camera.getPickRay(cartesian2),
	viewer.scene
); 
  • 考虑球面、地形,三维模型

使用场景参考:Cesium为3dTile模型添加气泡框

const cartesian3 = Cesium.viewer.scene.pickPosition(cartesian2)

笛卡尔空间直角坐标转屏幕坐标

使用场景参考:Cesium为3dTile模型添加气泡框

const Cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
      scene,
      cartesian3
    );

Cesium相机

默认交互

在三维世界中不仅需要确定视点的位置,还需要确定视线方向,Cesium通过相机来控制场景中的视域,旋转、缩放、平移等操作都可控制相机移动。Cesium具有默认的鼠标和触摸事件处理程序和摄像头交互:

  • 左键单击并拖动:移动整个地图
  • 右键单击并拖动:放大和缩小相机
  • 中轮滚动:放大和缩小相机
  • 中键点击并拖动:围绕地球表面的点旋转相机

相机姿态参数

Cesium通过Orientation来确定相机的方向,其设定原理和右手笛卡尔坐标系原理相同,主要包括以下三个参数:

  • heading( 偏航角): 默认方向为正北(0°),正角度为向东旋转,即左右摇头。
  • pitch( 俯仰角): 默认角度为-90°,即朝向地面,0°为平视,正角度为仰视,负角度为俯视,即抬头低头。
  • roll( 翻转角): 默认角度为0°,正角度向右旋转,负角度向左旋转,即左右翻滚。

常用方法

DEFAULT_VIEW_RECTANGLE

设置cesium默认视角范围

  Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
    110, // 西边的经度   
    39, // 南边维度  
    120, // 东边经度    
    41 // 北边维度 
  );
  

在这里插入图片描述

setView

将视角切换到目标范围内,没有飞行过程,快速切换

viewer.camera.setView({
    // 指定相机位置
    destination: Cesium.Cartesian3.fromDegrees(119, 40, 100),
    // 指定相机视角
    orientation: {
      heading: Cesium.Math.toRadians(0),
      pitch: Cesium.Math.toRadians(-20),
      roll: 0,
    },
  });

flyTo

相机空中飞行至目标视域。

viewer.camera.setView({
    // 指定相机位置
    destination: Cesium.Cartesian3.fromDegrees(119, 40, 100),
    // 指定相机视角
    orientation: {
      heading: Cesium.Math.toRadians(0),
      pitch: Cesium.Math.toRadians(-20),
      roll: 0,
    },
    duration: 1,  // 相机飞行持续的时间
   // pitchAdjustHeight: -90, //如果摄像机飞越高度高于该值,则会调整俯仰角度,保证地球在视域中
   // flyOverLongitude:100, //相机飞向目的地的过程中,必须强制经过东经100°子午线
  });

flookAt

相机视角固定在目标位置

var position = Cesium.Cartesian3.fromDegrees(119, 40, 100); 
var heading =  Cesium.Math.toRadians(10);
var pitch = Cesium.Math.toRadians(-80.0);
var range = 0;
viewer.camera.lookAt(position,new Cesium.HeadingPitchRange(heading,pitch,range));

总结

Cesium 坐标系

  • 屏幕坐标系
  • 空间直角坐标系
  • WGS-84坐标系

坐标系转换

  • 角度与弧度互转
  • 84坐标转笛卡尔空间坐标
  • 笛卡尔空间坐标转84坐标
  • 屏幕坐标转笛卡尔空间坐标
  • 笛卡尔空间直角坐标转屏幕坐标

Cesium相机

  • 默认交互
  • 相机姿态参数
  • 常用方法
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium中,可以使用以下代码将J2000坐标系中的位置向量转换为笛卡尔坐标系中的位置向量: ```javascript var j2000Position = new Cesium.Cartesian3(x, y, z); // J2000坐标系中的位置向量 var j2000ToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time); // 获取J2000到固定参考系的转换矩阵 var fixedPosition = new Cesium.Cartesian3(); Cesium.Matrix3.multiplyByVector(j2000ToFixed, j2000Position, fixedPosition); // 将J2000坐标系中的位置向量转换为固定参考系中的位置向量 ``` 其中,`Cesium.Transforms.computeIcrfToFixedMatrix(time)`方法用于获取J2000到固定参考系的转换矩阵,`time`参数为转换时刻。转换矩阵是一个3x3的矩阵,表示J2000坐标系到固定参考系的旋转关系。使用`Cesium.Matrix3.multiplyByVector`方法可以将J2000坐标系中的位置向量转换为固定参考系中的位置向量。 同样,可以使用以下代码将笛卡尔坐标系中的位置向量转换为J2000坐标系中的位置向量: ```javascript var fixedPosition = new Cesium.Cartesian3(x, y, z); // 固定参考系中的位置向量 var fixedToJ2000 = Cesium.Transforms.computeFixedToIcrfMatrix(time); // 获取固定参考系到J2000的转换矩阵 var j2000Position = new Cesium.Cartesian3(); Cesium.Matrix3.multiplyByVector(fixedToJ2000, fixedPosition, j2000Position); // 将固定参考系中的位置向量转换为J2000坐标系中的位置向量 ``` 其中,`Cesium.Transforms.computeFixedToIcrfMatrix(time)`方法用于获取固定参考系到J2000的转换矩阵。同样,使用`Cesium.Matrix3.multiplyByVector`方法可以将固定参考系中的位置向量转换为J2000坐标系中的位置向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值