问题:模型的modelMatrix旋转后如何获取到模型的的姿态(方位角:heading,俯仰角:pitch,倾斜角:roll)
过程:
旋转:
var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(30.0));
const rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
Cesium.Matrix4.multiply(
model.modelMatrix,
rotationX,
model.modelMatrix
);//模型原始的变换矩阵*旋转矩阵=旋转后的矩阵
2.获取旋转后的角度 // getTranslation获取当前模型的位置,并以当前位置建立东-北-上的变换矩阵
var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Matrix4.getTranslation(item.primitive.modelMatrix, new Cesium.Cartesian3()), Cesium.Ellipsoid.WGS84, new Cesium.Matrix4());
// 因为之前的模型旋转是相乘,那么现在就要获取以标准矩阵与旋转后的相除,就能获取旋转矩阵。Matrix4没有提供相除的方法。那么就用inverse将标准矩阵置为倒数。相当于开始的旋转是 X*Y=XY,那么现在知道XY及X,求Y。Y=XY*1/X.
var m3 = Cesium.Matrix4.multiply(Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()), item.primitive.modelMatrix, new Cesium.Matrix4());
// 得到旋转矩阵
var mat3 = Cesium.Matrix4.getMatrix3(m3, new Cesium.Matrix3());
// 计算四元数
var q = Cesium.Quaternion.fromRotationMatrix(mat3);
// 计算旋转角(弧度)
var hpr = Cesium.HeadingPitchRoll.fromQuaternion(q);
// 得到角度
var heading = Cesium.Math.toDegrees(hpr.heading);
var pitch = Cesium.Math.toDegrees(hpr.pitch);
var roll = Cesium.Math.toDegrees(hpr.roll);
参考相关博客:https://blog.csdn.net/qq_40043761/article/details/81020823