在cesium的开发中,有时会碰到局部的空间坐标计算,特别是在涉及到三维模型加载的场景中,例如,已知一个点的经纬度坐标,计算附近与它相距x、y、z距离的一个新坐标位置,同样需要换算成经纬度坐标,有时还需要考虑水平旋转和上下倾角。
计算方法
cesium的Transforms里提供了根据当前点,建立一个局部坐标系的方法,通过矩阵进行坐标的转换,局部坐标系的建立方式:
//_ca_coord为Cartesian3坐标,可以通过Cesium.Cartesian3.fromDegrees,由经纬度坐标进行转换;
//eastNorthUp代表东、北、上,对应x\y\z
const _localToWorld_Matrix =
Cesium.Transforms.eastNorthUpToFixedFrame(_ca_coord);
以上点作为局部坐标系的原点,距离它x、y、z的新坐标计算方式为:
//通过矩阵乘法进行实现,结果为Cartesian3坐标,同样可以转换为经纬度
const _new_ca =
Cesium.Matrix4.multiplyByPoint(_localToWorld_Matrix, Cesium.Cartesian3.fromElements(x, y, z), new Cesium.Cartesian3());
假如有偏北的旋转角,需要在转换矩阵上加上角度的转换:
//偏北方向是绕Z轴进行旋转,弧度值,其他旋转可以对应坐标轴
let rotz = Cesium.Matrix3.fromRotationZ(rad);
let rotationZ = Cesium.Matrix4.fromRotationTranslation(rotz);
Cesium.Matrix4.multiply(_localToWorld_Matrix, rotationZ, _localToWorld_Matrix);
同样,用新的矩阵,按照前边的方式进行相乘,就能够得出新的坐标了。