什么是四元数

四元数是一个简单的超复数,我就简单理解为由一个标量和一个3D向量组成(a,(x,y,z))

为什么要用四元数

一些概念

  1. 轴-角对

    在3D空间中,任意旋转都a可以表示为绕着某个轴旋转一个旋转角得到。

    在这里标量a就是这个旋转角,(x,y,z)就是该轴。

    对于给定的旋转角标量a和轴(x,y,z),那么可以构成四元数Quaternion为[cos(a/2) ,sin(a/2)x , sin(a/2)y , sin(a/2)z].Unity中为 [sin(a/2)x , sin(a/2)y , sin(a/2)z , cos(a/2)]

  2. unity中的四元数

    unity中的四元数Quaternion,类型结构体

    初始化方法

    • 公式初始化

      Quaternion q=new Quaternion( sin(a/2)x , sin(a/2)y , sin(a/2)z , cos(a/2) );

    • 方法初始化

      Quaternion q=Quaternion.AngleAxis(角度,轴);

      Quaternion q=new Quaternion.AngleAxis(a,(x,y,z))

    与欧拉角的互相转化

    • 欧拉角到四元数

      q=Quaternion.Euler(欧拉角)

    • 四元数到欧拉角

      Vector3 v=q.eulerAngles;

四元数计算注意点

有四元数的相乘,相乘顺序不同得到的结果就不同(这里谈的不是数值,而是目的)

  1. 四元数旋转:两个四元数相乘返回一个新四元数

    q=q1*q2

    注意的是此次相乘是基于前者坐标系进行的旋转,并非基于世界坐标系也不是基于后者坐标系

  2. 向量旋转:四元数相乘向量返回一个新向量,

    v=q1*v1

    注意顺序不能改变,一定是四元数乘以向量,而不是向量乘以四元数

    四元数乘以向量规则为q1*(0,v)*(q1-1)

    这里会有一个将向量扩充为四元数的过程,计算结束时也将有一个将四元数回溯为向量的过程,