四元数插值Eigen源码解析

这篇具有很好参考价值的文章主要介绍了四元数插值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[t\Omega ]}{\sin \Omega }}q_{1}}, 0 ≤ t ≤ 1 Slerp(q0,q1;t)=sinΩsin[(1t)Ω]q0+sinΩsin[tΩ]q1,0t1
原理可以看这篇博客
根据公式我们可以比较清晰的分析四元数插值Eigen源码,源码如下所示:文章来源地址https://www.toymoban.com/news/detail-438501.html

/** \returns the spherical linear interpolation between the two quaternions
  * \c *this and \a other at the parameter \a t in [0;1].
  * 
  * This represents an interpolation for a constant motion between \c *this and \a other,
  * see also http://en.wikipedia.org/wiki/Slerp.
  */
  /** 
  * 返回两个四元数之间的球面线性插值
  * onst Scalar& t : 插值的比例系数,插值时刻距离起始四元数的时间
  * 占两个四元数时间间隔的多少
  * other:插值的另一个四元数$q_{1}$
  **/
template <class Derived>
template <class OtherDerived>
EIGEN_DEVICE_FUNC Quaternion<typename internal::traits<Derived>::Scalar>
QuaternionBase<Derived>::slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const
{
// 使用std::acos和std::sin
  EIGEN_USING_STD_MATH(acos)
  EIGEN_USING_STD_MATH(sin)
  // Scalar类型的1,NumTraits<Scalar>::epsilon(),参考这个https://eigen.tuxfamily.org/dox/structEigen_1_1NumTraits.html
  const Scalar one = Scalar(1) - NumTraits<Scalar>::epsilon();
  // 两个四元数向量的点积,因为四元数的模长都为1所以点积就是夹角的余弦值
  Scalar d = this->dot(other);
  /**
  *  如果四元数点积的结果是负值(夹角大于90°),那么后面的插值就会在4D球面上绕远路。
  * 为了解决这个问题,将余弦值取绝对值保证这个旋转走的是最短路径。
  **/
  Scalar absD = numext::abs(d);

  Scalar scale0;
  Scalar scale1;
// 如果两个四元数的夹角的cos值接近1的话,为了避免除法出问题,直接算极限 lim_{t->0}{sint/t} = 1
  if(absD>=one)
  {
    scale0 = Scalar(1) - t;
    scale1 = t;
  }
  else
  {
    // theta is the angle between the 2 quaternions
    // 计算四元数向量之间夹角
    Scalar theta = acos(absD);
    Scalar sinTheta = sin(theta);

    scale0 = sin( ( Scalar(1) - t ) * theta) / sinTheta;
    scale1 = sin( ( t * theta) ) / sinTheta;
  }
  if(d<Scalar(0)) scale1 = -scale1;
// coeffs返回的是以(x,y,z,w)顺序的四元数,因为如果通过double直接对四元数初始化赋值的话它的顺序是(w,x,y,z)
  return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
}

到了这里,关于四元数插值Eigen源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

     效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

    2024年04月14日
    浏览(69)
  • 四元数的理解

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

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

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

    2024年02月15日
    浏览(32)
  • 四元数计算

    两个四元数相乘得到一个新的四元数,代表两个旋转量的叠加,相当于旋转 注意:旋转相对的坐标系,是物体自身坐标系 例如绕 自身y轴 转20度: 如果绕自身y轴转40度,那么就再乘一个q: 四元数乘向量返回一个新向量, 可以将指定向量旋转对应四元数的旋转量,相当于旋

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

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

    2024年02月13日
    浏览(33)
  • Unity之四元数计算

    模拟飞机发射不同类型子弹的方法,单发,双发,扇形,环形 用3D数学知识实现摄像机跟随效果 1.摄像机在人物斜后方,通过角度控制倾斜率 2.通过鼠标滚轮控制摄像机距离人物的距离(有最大最小限制) 3.摄像机看向任务头顶上方的一个位置(可调节) 4.Vector3.Lerp实现相机

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

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

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

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

    2024年01月18日
    浏览(55)
  • Unity旋转 欧拉角和四元数

    Unity中的旋转最为常知的是Transform.rotation,但其内部实现是由 Quaternion (四元数)进行计算处理,而Inspactor中显示的旋转值是由 EulerAngles (欧拉角)处理。 Unity使用四元数对实际的旋转值进行计算和存储,使用欧拉角对基于世界空间坐标的旋转进行描述和显示,而Inspacetor中显示

    2024年02月13日
    浏览(46)
  • Unity --- quaternion(四元数)类API

    1.欧拉角转四元数 --- 调用方法 ; 四元数转欧拉角 --- 调用属性  2.上面这个方法是绕给定轴/角进行旋转  1.第三个方法 --- LookRotation() --- 该方法需要一个Vector3类对象(以向量的形式)作为参数 --- 该方法会返回一个四元数 ,返回的这个新的四元数能够使物体自身坐标系的Z轴

    2023年04月09日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包