主要代码
// 本地坐标与世界坐标的变换
// 获取A点对应的世界坐标
let posA = Cesium.Cartesian3.fromDegrees(0, 0.0, 0.0);
console.log("A点世界坐标:", posA);
// 本地坐标到世界坐标的变换矩阵
let localToWorldMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(posA);
// 通过矩阵的逆,求出世界坐标到本地坐标的变换矩阵
let worldToLocalMatrix = Cesium.Matrix4.inverse(localToWorldMatrix , new Cesium.Matrix4());
// 将B点世界坐标转换到A点本地坐标系下的坐标
let posB = Cesium.Cartesian3.fromDegrees(2, 1.0, 0.0);
console.log("B点世界坐标:", posB);
let localPosB = Cesium.Matrix4.multiplyByPoint(worldToLocalMatrix , posB, new Cesium.Cartesian3());
console.log("B点本地坐标(以A为原点的本地坐标系):", localPosB);
// 将B点本地坐标(A为原点的本地坐标系)转世界坐标
let worldPointB = Cesium.Matrix4.multiplyByPoint(localToWorldMatrix , localPosB, new Cesium.Cartesian3());
console.log("B点世界坐标:", worldPointB);
console.log("B点世界坐标(经纬度格式):", Cesium.Cartographic.fromCartesian(worldPointB));
// 部分输出
// A点世界坐标: Cartesian3 {x: 0, y: 0, z: 1}
// B点世界坐标: Cartesian3 {x: 0, y: 0, z: 2}
// B点本地坐标(以A为原点的本地坐标系): Cartesian3 {x: 0, y: 0, z: 1}
// A点世界坐标: Cartesian3 {x: 0, y: 1, z: 1}
// B点世界坐标: Cartesian3 {x: 0, y: 0, z: 2}
// B点本地坐标(以A为原点的本地坐标系): Cartesian3 {x: 0, y: 1.414205586940174, z: 0.00474951231167009}
// 可以看出并不是直接的加减操作,说明坐标系变换中包含旋转
参考链接
[1]. Cesium之矩阵变换
[2]. Cesium之球心坐标与本地坐标
[3]. Cesium当中的逆矩阵的简单理解