zoukankan      html  css  js  c++  java
  • 四元数基础

      

    四元数基础

      以下内容摘自《3D数学基础:图形与游戏开发》(清华大学出版社)

    四元数  

                         

    1.四元数和轴-角对

      绕轴n旋转θ角:n是一个向量,根据左手或右手法则定义旋转的正方向, θ角表示旋转的量。

      那么表示这个旋转的四元数为:

     

    2.单位四元数

      几何上存在两个单位四元数,它们代表没有角位移:

      任意四元数乘以一个几何单位四元数得到的角位移相同(虽然乘以两种形式得到q和-q的数形式不同,但是几何意义相同,可以认为结果相同)。

      数学上实际只有一个单位四元数,即:

      因为数学上q和-q不相等。

     

    3.四元数的模

     

     

      代入轴-角对的公式求模。

      n为单位向量,最后可以得到四元数的模为1.称为单位四元数

     

    4.四元数的共轭和逆

      四元数的共轭就是让四元数的向量部分取负,记作:

     

      四元数和它的共轭代表相反的角位移,因为相当于旋转轴反向。

      四元数的逆定义为四元数的共轭除以它的模:

     

      一般使用单位四元数,此时它的逆和共轭其实是相等的。

     

    5.四元数乘法(叉乘)

     

     

      不用为四元数叉乘使用乘号,“行”“列”四元数也没有什么区别。

      四元数叉乘满足结合律,但是不满足交换律。

      四元数乘积的模等于模的乘积,这样保证了单位四元数相乘仍然是单位四元数。

      四元数乘积的逆等于各个四元数的逆以相反的顺序相乘。

     

    6.标准3D点的四元数旋转

      扩展一个标准的3D点(x,y,z)到四元数空间,通过定义四元数:

      即可。

      设我们讨论的旋转四元数为:

     

      则执行下面的乘法可以使3D点p绕n旋转:

     

      多次旋转的情况:

      注意这个旋转是以从右向左的顺序发生的。

     

      可以改变标准的定义,以相反的运算顺序来定义四元数乘法,从而将形式变为与旋转发生的顺序一致,此处公式略去。

     

    7.四元数“差”

      利用四元数的乘法和逆,可以计算两个四元数的“差”,四元数“差”表示一个方位到另一个方位的角位移

      注意不能除以四元数,只能乘以它们的逆来达到目的

    8.四元数的点乘

      点乘结果是标量,两个单位四元数点乘的结果区间为[-1,1]。

      点乘结果的绝对值越大,相乘的两个四元数代表的角位移越相似。

    9.四元数的对数、指数和标量乘运算

      略。

    10.四元数求幂

      若四元数 代表一个角位移, 中取t等于1/3,就得到代表1/3这个角位移的四元数。

      注意的是四元数表达角位移时使用最短圆弧,不能绕圈。

      即如果q代表绕x轴顺时针旋转60°,那么t取4时不是预期的绕x轴顺时针旋转240°,而是逆时针80°。

      所以凡是涉及到指数运算的代数公式,如 ,对四元数不再适用。

      S=4,t=1/2,本来应该是等同于 ,然而由于t=4时选了最短弧,所以产生的不是预期的结果。

    11.四元数插值——“Slerp”

      球面线性插值Spherical Linear Interpolation).

      Slerp运算非常有用,因为它可以在两个四元数间平滑插值,避免了欧拉角插值的所有问题(角度限制以找到最短弧,万向锁(导致抖动、路径错误),根本问题是插值过程中角速度不是恒定的。)

      两个标量间的插值一般是这样:

     

     

      可以使用同样的步骤在四元数间插值:

      (1).计算两个值的差。利用逆矩阵推到的。

      (2).计算差的一部分。(四元数求幂)。

      (3).在开始值上加上差的一部分。(方法使用四元数乘法来组合角位移)

     

      这是理论上的Slerp计算过程。实践中将使用一种更加有效的方法。

      所有单位四元数都存在于一个4D球面上。

      几何推导略。结果:

     

      可以用点乘来计算两个四元数之间的“角度”。

      有两点需要考虑:

      (1)四元数q和-q代表相同的方位,但它们作为slerp的参数时可能导致不一样的结果。解决方法是选择两个数的符号使得它们点乘的结果是非负。

      (2)如果两个四元数非常接近,那么sin会非常小,这时候除法可能会出现问题,为了避免这样的问题,当sin非常小时使用简单的线性插值。

     

    12.四元数样条——“squad”

       

     Spherical and Quadrangle

      木有看懂。

    13.四元数的优缺点

      优点:

      平滑插值。

      快速连接和角位移求逆。

      能和矩阵形式快速转换。

      仅用四个数。

      缺点:

      比欧拉角稍微大一些。

      四元数可能不合法。坏的输入数据或浮点数舍入误差积累引起。(通过四元数标准化解决这个问题,确保四元数为单位大小。)

      难于使用。

    14.四元数、欧拉角、矩阵之间的转换

      略。

    参考资料:

      《3D数学基础:图形与游戏开发》(清华大学出版社)

  • 相关阅读:
    IDE-Sublime【3】-配置Node.js开发环境
    Java-Android【2】-弹出对话框
    Node.js-中文分词【1】-node-segment
    Java-Android【1】-控制手机震动
    IDE-Sublime【2】-代码智能提示插件SublimeCodeIntel的安装
    Node.js-安装配置【1】-在Windows XP系统配置环境变量
    Node.js-部署【1】-防火墙端口的配置
    Node.js-npm【1】-常用命令
    Node.js-视图引擎【1】-Swig集成express的安装与配置
    NoSQL-Redis【2】-HDEL给我的一个惊喜
  • 原文地址:https://www.cnblogs.com/mengdd/p/3238223.html
Copyright © 2011-2022 走看看