【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向

在Cesium的使用过程中,常常需要计算模型在移动过程中的朝向,除了可以利用位置信息让Cesium自动计算之外,还可以通过一些矩阵变换的方法控制模型的朝向,本篇文章笔者记录了自己计算模型朝向信息的方法,欢迎交流~

大致思路是先根据模型的速度信息、位置信息,建立模型本体坐标系,进而获取站心坐标系到模型坐标系的旋转矩阵,根据这个旋转矩阵获取欧拉角,最后再用模型的当前位置和欧拉角获得朝向四元数。
这里有两点需要说明:

  1. Cesium中的欧拉角(hpr)是对于站心坐标系而言的,使用Transforms.headingPitchRollQuaternion(position,hpr)这个方法,默认就是根据在地固坐标系下的当前位置信息和站心坐标系下的当前欧拉角(hpr)计算朝向四元数。
  2. 站心坐标系是东北天坐标系,在极点附近会发生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方法的理解

综上,可以实现模型在运动过程中的调整朝向,欢迎交流~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值