当前位置: 首页 > news >正文

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

前言

        在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 表示方向)。

       


        

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

相关文章:

  • 实用生活c语言脚本
  • Android如何通过aspectj打造一个无侵入式动态权限申请框架
  • webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)
  • IDEA创建Gradle项目然后删除报错解决方法
  • 调整IntelliJ IDEA中当前文件所在目录的显示位置
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]:在Mac App Store外创建、部署与公证
  • CoinNexus Chain 推出泰利风暴,开启 Web3.0 智能金融元宇宙科技新时代
  • Lua 第8部分 补充知识
  • webrtc使用
  • 自然语言处理 | 语言模型(LM) 浅析
  • 【MCP Node.js SDK 全栈进阶指南】中级篇(2):MCP身份验证与授权实践
  • AI数字人:品牌营销的新宠与增长密码(6/10)
  • 【Linux】计算机基本知识补充
  • 使用PyTorch构建神经网络笔记
  • 【音视频】FFmpeg内存模型
  • 准确--Tomcat更换证书
  • 短视频+直播商城系统源码全解析:音视频流、商品组件逻辑剖析
  • 【延迟双删】简单解析
  • Java 安全:如何防止 SQL 注入与 XSS 攻击?
  • 【Harmony】常用工具类封装
  • 神舟二十号主要目的发布,在空间站驻留约6个月
  • 国际金价冲上3500美元,本月已涨超12%!分析人士提醒:警惕短期多头获利了结
  • 视频·世界读书日|林乾:碎片化阅读或影视综艺≠知识
  • 大学2025丨浙大哲学院院长王俊:文科的价值不在于直接创造GDP
  • 钱理群|直面衰老与死亡
  • 伊朗艺术中的中国风