Skip to content
Cesium计算模型姿态

实现

  1. 我们首先使用Cesium.Transforms.eastNorthUpToFixedFrame方法创建一个基于地球坐标系的固定参考帧m1,该参考帧用于描述模型的朝向。
  2. 接下来,我们通过将m1的逆矩阵与模型的变换矩阵transform相乘,得到一个新的变换矩阵m3。这个矩阵包含了模型相对于固定参考帧的旋转信息。
  3. 我们从m3中提取出旋转矩阵mat3,然后使用Cesium.Quaternion.fromRotationMatrix方法将其转换为四元数q
  4. 最后,我们使用Cesium.HeadingPitchRoll.fromQuaternion方法从四元数q中获取模型的朝向、俯仰角和滚转角。
  5. 将计算得到的姿态信息存储在dataObj对象的headingpitchroll属性中。
javascript
// 计算模型的朝向
function computeModelHeading(transform) {
    const m1 = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Matrix4.getTranslation(transform, new Cesium.Cartesian3()), Cesium.Ellipsoid.WGS84, new Cesium.Matrix4());

    const m3 = Cesium.Matrix4.multiply(Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()), transform, new Cesium.Matrix4());

    const mat3 = Cesium.Matrix4.getMatrix3(m3, new Cesium.Matrix3());
    const q = Cesium.Quaternion.fromRotationMatrix(mat3);
    const hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);

    // 获取模型的heading、pitch、roll
    const heading = Cesium.Math.toDegrees(hpr.heading);
    const pitch = Cesium.Math.toDegrees(hpr.pitch);
    const roll = Cesium.Math.toDegrees(hpr.roll);

    dataObj.heading = heading;
    dataObj.pitch = pitch;
    dataObj.roll = roll;
}

https://bu.dusays.com/2023/06/21/6492a685378d2.png

Updated at: