深色模式
局部坐标与 ENU
“向东移动一百米”是局部描述。ECEF 的 X、Y、Z 固定于整个地球,不能把某一个轴在全球都当作东方。局部东—北—天坐标(East-North-Up,ENU)以选定地理点为原点,把 X、Y、Z 分别对准东、北和椭球法线方向。模型摆放、风向转换与局部传感器姿态都依赖这个概念。
矩阵可以先当作“把局部方向和原点放进世界”的计算表。需要从零建立直觉时,配合向量与矩阵和参考系阅读。
一张矩阵同时表示朝向与原点
局部坐标变成世界坐标可写成 p_world = R p_local + t。p 是三个位置分量组成的列向量(column vector),单位为米;R 是 3×3 旋转矩阵(rotation matrix),三列分别是东、北、天的单位向量(unit vector),长度为 1、没有米的单位;t 是原点平移(translation),单位为米。矩阵乘法表示按 R 的三个方向组合局部分量,之后再加原点位置。齐次矩阵(homogeneous matrix)把这两步放进 4×4 矩阵,便于组合。
以下计算片段假设已执行 import * as Cesium from 'cesium';这里省略模块导入,不需要为计算单独创建 Viewer。本课第二个片段继续使用第一个片段创建的 enuToWorld。
js
const origin = Cesium.Cartesian3.fromDegrees(114, 22, 0);
const enuToWorld = Cesium.Transforms.eastNorthUpToFixedFrame(origin);
const nearby = Cesium.Matrix4.multiplyByPoint(
enuToWorld,
new Cesium.Cartesian3(100, 0, 30),
new Cesium.Cartesian3(),
);
// nearby:从局部原点向东100米、向天30米的位置。注意这里的三十米是沿原点处的“天”方向,不是在每个位置都重新贴合地表。ENU 的东、北轴组成局部切平面(tangent plane),即在原点与椭球相切的平面,适合局部范围;当范围扩展到数百千米时,平面会逐渐偏离弯曲地球。全球天气网格必须回到球面或椭球上的参数化表达。
点有原点,速度没有平移
一个风矢量(vector)描述“每秒向东十米、向北两米”。向量有大小和方向;这里的分量是速度,单位为米每秒(m/s),而不是位置的米。它需要旋转到世界方向,却不应再加上地心到观测站的平移。把速度误用 multiplyByPoint 转换,会给速度混入几百万米的地心坐标。
js
const velocityWorld = Cesium.Matrix4.multiplyByPointAsVector(
enuToWorld,
new Cesium.Cartesian3(10, 2, 0),
new Cesium.Cartesian3(),
);这也解释了为什么不能把全球 U/V 分量直接当成 ECEF 的 X/Y 分量:每个采样位置的东、北方向都不同。两地风矢量要在三维空间比较,先变换到共同参考系才有意义。
地球上的坐标系
移动经纬度,观察 ECEF 数值和局部 ENU 坐标轴。
在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放
底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码
此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。
读取源码…观察任务: 选择赤道附近与高纬两个位置,把“局部坐标轴长度”从 400 调到 1000 千米,观察东、北轴逐渐离开地表。沿局部“天”方向抬高对象时,它是否总是朝向画面的上方?
展开解释
不是。局部天方向由地球形状与地理位置决定,画面上方由相机决定。旋转相机可以让同一条天方向轴朝向屏幕任意方向。坐标变换描述物理空间,相机投影决定最后看见的二维方向。