Cesium学习笔记——坐标系统及坐标转换

#新星杯·14天创作挑战营·第10期#

前言

        在Cesium的学习中,学会读文档十分重要!!!在这里附上Cesium中英文文档1.117

        在Cesium中,一共有四种比较重要的坐标系,分别是地理坐标系,地心地固坐标系,东-北-上局部坐标系和屏幕坐标系,接下来我们一一学习一下他们的特点。

一、WGS84 坐标系(地理坐标系)

1.1、坐标系介绍

        地理坐标系(Geographic Coordinate System),是使用三维球面来定义地球表面位置,以实现通过经纬度对地球表面点位引用的坐标系。一个地理坐标系包括角度测量单位、本初子午线和参考椭球体三部分。地理坐标系依据其所选用的本初子午线、参考椭球的不同而略有区别。

        在cesium中,采用的参考椭球为WGS84。

定义​

  • ​格式​​:[经度,纬度,高度]
    • ​经度​​(Longitude):-180° 到 180°,东经为正。
    • ​纬度​​(Latitude):-90° 到 90°,北纬为正。
    • ​高度​​(Height):椭球体高度(米),基于 WGS84 椭球面。
  • ​核心用途​​:人类可读的地理位置输入(如 GPS 坐标、地图标记)。

1.2、角度与弧度的转换

        在Cesium里,经纬度分角度经纬度和弧度经纬度,他们有不同的应用范围。

        弧度地理坐标还有一个类叫Cartographic。

        弧度转角度可以通过数学函数来实现。

degreeLongitude=Cesium.Math.toDegrees(radianLongitude);
degreeLatitude=Cesium.Math.toDegrees(radianLatitude);

        角度转弧度有两种方法, 一种是数学函数,一种是Cartographic的静态函数。

        数学函数

const radianLongitude=Cesium.Math.toDegrees(degreeLongitude);
const radianLatitude=Cesium.Math.toDegrees(degreeLatitude);

        Cartographic.fromDegrees 函数

const cartographic=Cesium.Cartographic.fromDegrees(degreeLongitude, degreeLatitude, height)

1.3、注意事项

    WGS84 高度是相对于椭球面的,如需获取真实地面高度,需使用地形数据。

const sampledHeight = viewer.scene.globe.getHeight(
  new Cesium.Cartographic.fromDegrees(116.39, 39.9)
); // 可能返回 undefined(无地形数据)

 

二、地心地固坐标系(ECEF)

2.1、坐标系介绍

        地理坐标系由于三个坐标量是经纬度和高度,并不利于数学计算,因此,在Cesium,用笛卡尔三维坐标来进行计算,但是三个坐标轴该如何选取呢?

        地心地固坐标系(Earth-Centered, Earth-Fixed,简称ECEF)简称地心坐标系,是一种以地心为原点的地固坐标系(也称地球坐标系),是一种笛卡儿坐标系。原点 O (0,0,0)为地球质心,z 轴与地轴平行指向北极点,x 轴指向本初子午线与赤道的交点,y 轴垂直于xOz平面(即东经90度与赤道的交点)构成右手坐标系。

        这种坐标系刚好符合满足计算要求,因此Cesium的笛卡尔三维坐标采用地心地固坐标系

定义​

  • ​原点​​:地球质心。
  • ​轴方向​​:
    • ​X 轴​​:赤道与本初子午线(0° 经度)的交点。
    • ​Z 轴​​:地球自转轴(指向北极)。
    • ​Y 轴​​:与 X、Z 轴构成右手坐标系(东经 90° 方向)。
  • ​核心用途​​:卫星轨道计算、精确弹道模拟、全球空间分析。

图片来源百度百科

                                                                图片来源百度百科

2.2、坐标转换

2.2.1、经纬度转笛卡尔坐标(ECEF)

        经纬度转地心地固坐标可以通过fromRadians和fromDegrees函数,这两个函数分别把弧度地理坐标和角度地理坐标转成地心地固坐标。

 2.2.2、地心地固坐标转经纬度

        地心地固坐标无法直接转角度经纬度,但是可以直接转弧度经纬度。因此如果要角度经纬度,我们还需要通过数学函数进行转换。

const cartographic = Cesium.Cartographic.fromCartesian(ecefPosition);
//转角度
const lon = Cesium.Math.toDegrees(cartographic.longitude);
const lat = Cesium.Math.toDegrees(cartographic.latitude);
const height = cartographic.height; // 椭球高度,非地面实际高度!

三、东-北-上局部坐标系(ENU)

3.1、坐标介绍

        在Cesium中,东-北-上局部坐标系一般用于控制模型的姿态(后面文章再介绍)。

        定义​

  • ​原点​​:用户定义的参考点(如某个经纬度位置)。
  • ​轴方向​​:
    • ​East (X)​​:局部东方向。
    • ​North (Y)​​:局部北方向。
    • ​Up (Z)​​:垂直于椭球面向上(非垂直地面!)。

3.2、地心地固坐标转局部坐标

        地心地固坐标可以直接转局部坐标矩阵,但是不能直接转经纬度。

 

四、屏幕坐标系

4.1、坐标介绍

定义​

  • ​原点​​:画布左上角 (0, 0),右下角为 (width, height)(像素单位)。
  • ​核心用途​​:处理鼠标点击、屏幕叠加元素(如 HUD 文字)。

4.2、获取屏幕坐标

        屏幕坐标一般和鼠标事件在一起处理,通过ScreenSpaceEventHandler类里的setInputAction函数取得,该函数第一个参数为一个回调函数,我们可以通过这个来获取屏幕的坐标。

let drawHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
drawHandler.setInputAction((e) => { // 监听鼠标左键点击事件
    const p = e.position;//屏幕坐标
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

4.3、屏幕坐标转地心地固坐标

        将屏幕坐标转地球坐标我们可以通过scene对象的pickPosition函数来进行转换。

let drawHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
drawHandler.setInputAction((e) => { // 监听鼠标左键点击事件
    const p = scene.pickPosition(e.position);//地心地固坐标
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

4.4、地心地固坐标转屏幕坐标

        地心地固坐标转屏幕坐标可以通过wgs84ToWindowCoordinates函数来完成。

const screenPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
  viewer.scene,
  globalPosition
);

 五、3D 空间中的数学工具

        除了坐标系外,cesium里还有一些和坐标系计算相关的内容,有了他们,我们可以对模型坐标进行平移旋转等数学计算。

5.1、四元数

定义​

​特性​

  • ​用途​​:表示 3D 旋转,避免万向节锁问题,且计算效率高。
  • ​结构​​:包含 4 个分量 [x, y, z, w],通常表示绕某个轴的旋转。
  • ​公式​​:
    q=[x,y,z,w]=cos(θ/2)+(i⋅x+j⋅y+k⋅z)sin(θ/2)
    其中,θ 是旋转角度,(x,y,z) 是旋转轴。
  • ​紧凑性​​:仅需 4 个数值,内存占用小于矩阵。
  • ​插值平滑​​:适合球面线性插值(SLERP),用于动画过渡。
  • ​归一化​​:四元数必须归一化(长度为 1)才能正确表示旋转。

         比如,绕y轴转90度。

// 创建四元数(绕 Y 轴旋转 90 度)
const axis = new Cesium.Cartesian3(0, 1, 0); // Y 轴
const angle = Cesium.Math.toRadians(90); // 弧度
const quaternion = Cesium.Quaternion.fromAxisAngle(axis, angle);

// 应用四元数到实体方向
entity.orientation = quaternion;

5.2、方向矩阵(Matrix3 和 Matrix4)

        方向矩阵​​中Matrix3表示旋转, Matrix4表示旋转 + 平移。

 5.3、Cartesian4

Cartesian4表示 4D 向量,常用于齐次坐标或矩阵运算。

  • ​结构​​:[x, y, z, w],其中:
    • x, y, z:空间坐标或方向分量。
    • w:齐次坐标的缩放因子(通常为 1 表示点,0 表示方向)。

       


        

        关于坐标系统及坐标转换到这里就结束了,如果大家喜欢我的文章的话,点一个免费的赞和关注吧!

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凕雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值