在Cesium的使用过程中,常常需要计算模型在移动过程中的朝向,除了可以利用位置信息让Cesium自动计算之外,还可以通过一些矩阵变换的方法控制模型的朝向,本篇文章笔者记录了自己计算模型朝向信息的方法,欢迎交流~
大致思路是先根据模型的速度信息、位置信息,建立模型本体坐标系,进而获取站心坐标系到模型坐标系的旋转矩阵,根据这个旋转矩阵获取欧拉角,最后再用模型的当前位置和欧拉角获得朝向四元数。
这里有两点需要说明:
- Cesium中的欧拉角(hpr)是对于站心坐标系而言的,使用Transforms.headingPitchRollQuaternion(position,hpr)这个方法,默认就是根据在地固坐标系下的当前位置信息和站心坐标系下的当前欧拉角(hpr)计算朝向四元数。
- 站心坐标系是东北天坐标系,在极点附近会发生180度的偏转,所以如果使用固定的欧拉角(hpr)在极点附近是会发生旋转现象的! 之所以先计算站心坐标系到模型坐标系的旋转矩阵,就是为了计算站心坐标系到模型坐标系中的偏移量,避免直接使用站心坐标系而发生的旋转现象
具体代码如下:
getQuaternion(positionEcf, velocityEcf) {
// 1、计算站心到模型坐标系的旋转平移矩阵
// 速度归一化
let normal = Cartesian3.normalize(velocityEcf, new Cartesian3());
// 计算模型坐标系的旋转矩阵
let satRotationMatrix = Transforms.rotationMatrixFromPositionVelocity(positionEcf, normal, Ellipsoid.WGS84);
// 模型坐标系到地固坐标系旋转平移矩阵
let m = Matrix4.fromRotationTranslation(satRotationMatrix, positionEcf);
// 站心坐标系(东北天坐标系)到地固坐标系旋转平移矩阵
var m1 = Transforms.eastNorthUpToFixedFrame(positionEcf, Ellipsoid.WGS84, new Matrix4());
// 站心到模型坐标系的旋转平移矩阵
let m3 = Matrix4.multiply( Matrix4.inverse(m1, new Matrix4()), m, new Matrix4());
// 2、模型姿态旋转矩阵(根据实际需要)
let h1 = 0, p1 = 0, r1 = 0;
let postureHpr = new HeadingPitchRoll( Math.toRadians(h1), Math.toRadians(p1), Math.toRadians(r1));
let postureMatrix = Matrix3.fromHeadingPitchRoll(postureHpr);
// 3、模型朝向旋转矩阵
let h2 = 0, p2 = -180, r2 = 0;
let sHpr = new HeadingPitchRoll( Math.toRadians(h2), Math.toRadians(p2), Math.toRadians(r2));
let sMatrix = Matrix3.fromHeadingPitchRoll(sensorHpr);
// 4、最终的旋转矩阵
let mat3 = Matrix4.getMatrix3(m3, new Matrix3());
let finalMatrix = Matrix3.multiply(mat3,postureMatrix,new Matrix3());
let finalMatrix1 = Matrix3.multiply(finalMatrix, sMatrix, new Matrix3())
let quaternion1 = Quaternion.fromRotationMatrix(finalMatrix1);
let hpr = HeadingPitchRoll.fromQuaternion(quaternion1);
let q2 = Transforms.headingPitchRollQuaternion(positionEcf,hpr);
return q2;
}
上文中使用Transforms.rotationMatrixFromPositionVelocity(positionEcf, normal, Ellipsoid.WGS84)计算模型坐标系的旋转矩阵,这是cesium自带的方法,我在另一篇博文里有分析它的源码
对rotationMatrixFromPositionVelocity方法的理解文章来源:https://www.toymoban.com/news/detail-522106.html
综上,可以实现模型在运动过程中的调整朝向,欢迎交流~文章来源地址https://www.toymoban.com/news/detail-522106.html
到了这里,关于【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!