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

这篇具有很好参考价值的文章主要介绍了【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方法的理解

综上,可以实现模型在运动过程中的调整朝向,欢迎交流~文章来源地址https://www.toymoban.com/news/detail-522106.html

到了这里,关于【Cesium】计算模型的朝向四元数,实现模型运动中调整朝向的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cesium 实战 - Blender调整模型组件原点,实现直升机尾翼旋转

    某个项目需求,在操作直升机模型的时候,希望直升机机翼和尾翼旋转起来。 机翼旋转比较容易,找到组件名称,按照之前的 《Cesium 实战 - AGI_articulations 扩展:模型自定义关节动作》设置即可实现。 但是在设置尾翼的时候,出现问题,这里记录一下问题以及解决方法。 本

    2024年02月15日
    浏览(66)
  • 转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

    由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄明白之后干脆写一篇文章,给人方便同时于己方便,后续如有扩充或变动也方便添加。 假设有两个向量 a 1 = ( x 1 , y 1 , z 1 ) a_1 = (x_1, y_1, z_1) a 1 ​ = ( x 1 ​ , y 1 ​ , z 1 ​

    2024年02月03日
    浏览(77)
  • 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

    旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,通过三者之间的转换可以减小一些算法的复杂度。 本文主要概述旋转矩阵、欧拉角、四元数的基本理论、三者之间的转换关系以及三者转换在eigen、matlab和pathon上的方法实现。 对于两个三维点 p1 、 p2 : p 1 ( x

    2023年04月11日
    浏览(44)
  • 【数理知识】三维空间旋转矩阵的欧拉角表示法,四元数表示法,两者之间的转换,Matlab 代码实现

    序号 内容 1 【数理知识】自由度 degree of freedom 及自由度的计算方法 2 【数理知识】刚体 rigid body 及刚体的运动 3 【数理知识】刚体基本运动,平动,转动 4 【数理知识】向量数乘,内积,外积,matlab代码实现 5 【数理知识】最小二乘法,从线性回归出发,数值举例并用最小

    2024年02月12日
    浏览(48)
  • 四元数的理解

    一共三个虚维度来描述空间,实数则在第四个维度,垂直于全部三个虚数轴 四元数可以优雅的描述并计算三维旋转 “四维右手法则” 两个复数Z和W相乘,把z当成一个函数,对w施加某种旋转和拉伸 左边的数作为一种函数,去变换右边的数 原则上将,把所有二维旋转的集合映

    2024年01月18日
    浏览(37)
  • 四元数

    传入一个向量,使物体旋转,如: 值得注意的是:Unity中组件Transform的Rotation实际上是Quaternion类型的 与上面功能类似,但更为简洁,如: 线性插值,与Mathf.Lerp差不多。 与transform.LookAt类似的是都是将其正方向指向目标方向,但是LookRotation可以做的跟更好 如: 值得注意的是:

    2024年02月15日
    浏览(32)
  • 四元数快速入门【Quaternion】

    四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。 推荐:用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 更熟悉和更容易可视化的滚动(Roll)

    2024年02月13日
    浏览(33)
  • Unity 四元数与物体旋转

    由三个角度(x,y,z)组成 在特定坐标系下用于描述物体的旋转量 空间中的任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列 欧拉角旋转约定——heading-pitch-bank 这是一种最常用的旋转序列约定——Y-X-Z约定 heading:物体绕自身的对象坐标系的Y轴旋转的角度 pitch:物体

    2024年01月18日
    浏览(55)
  • 数学概率 | 旋转矩阵、欧拉角、四元数

    目录 一,旋转矩阵 二维旋转矩阵 三维旋转矩阵 二,欧拉角 三,四元数 四,矩阵、欧拉角、四元数相互转换 四元数转矩阵 矩阵转四元数 欧拉角转矩阵 矩阵转欧拉角 欧拉角转四元数 四元数转欧拉角 二维旋转矩阵 R() =  推导,以二维平面为例旋转:  = cos( + ) = coscos - si

    2024年02月06日
    浏览(44)
  • 四元数插值Eigen源码解析

    四元数插值公式 Slerp ⁡ ( q 0 , q 1 ; t ) = sin ⁡ [ ( 1 − t ) Ω ] sin ⁡ Ω q 0 + sin ⁡ [ t Ω ] sin ⁡ Ω q 1 , 0 ≤ t ≤ 1 {displaystyle operatorname {Slerp} (q_{0},q_{1};t)={frac {sin {[(1-t)Omega }]}{sin Omega }}q_{0}+{frac {sin[tOmega ]}{sin Omega }}q_{1}}, 0 ≤ t ≤ 1 Slerp ( q 0 ​ , q 1 ​ ; t ) = sin Ω sin [( 1 −

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包