前言
在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 表示方向)。
关于坐标系统及坐标转换到这里就结束了,如果大家喜欢我的文章的话,点一个免费的赞和关注吧!