四元数扫盲

概念

四元数由三个虚部单位组成,分别为i、j、k。还有一个实部a。
一个四元数可以被表示成:x=a+bi+cj+dk.

解释

我们使用q=((x,y,z),w)=(v,w),其中v是向量,w是实数
把一个点P绕单位向量轴u=(x、y、z)表示的旋转轴旋转 θ \theta θ 角度。我们可表示为 q = ( ( x , y , z ) s i n θ 2 , c o s θ 2 ) q=((x,y,z)sin\frac{\theta}{2},cos\frac{\theta}{2}) q=((x,y,z)sin2θ,cos2θ)
第一步:将点P 扩张到四元数空间,即四元数p=(P,0).
第二部:算出旋转后新的四元数为:(此四元数实部为0,虚部就是就是新的坐标)
p ′ = p q q − 1 p^{'}=pqq^{-1} p=pqq1
其中, q = ( ( x , y , z ) s i n θ 2 , c o s θ 2 ) q=((x,y,z)sin\frac{\theta}{2},cos\frac{\theta}{2}) q=((x,y,z)sin2θ,cos2θ) q − 1 = q ∗ N ( q ) q^{-1}=\frac{q^*}{N(q)} q1=N(q)q,由于u是单位向量,因此N(q)=1,即 q − 1 = q ∗ q^{-1}=q^* q1=q

四元数相关性质:

四元数乘法: q 1 q 2 = ( v 1 ⃗ × v 2 ⃗ + w 1 v 2 ⃗ + w 2 v 1 ⃗ , w 1 w 2 − v 1 ⃗ × v 2 ⃗ ) q_1q_2=(\vec{v_1}\times\vec{v_2}+w_1\vec{v_2}+w_2\vec{v_1}, w_1w_2-\vec{v_1}\times\vec{v_2}) q1q2=(v1 ×v2 +w1v2 +w2v1 ,w1w2v1 ×v2 )

共轭四元数: q ∗ = ( − v 1 ⃗ , w ) q^*=(-\vec{v_1},w) q=(v1 ,w)

四元数的模:(四元数到原点的距离)
N ( q ) = ( x 2 + y 2 + z 2 + w 2 ) N(q)=\sqrt{(x^{2}+y^ {2}+z^{2}+w^{2})} N(q)=(x2+y2+z2+w2)

四元数的逆: q − 1 = q ∗ N ( q ) q^{-1}=\frac{q^*}{N(q)} q1=N(q)q

四元数旋转需要注意的地方

  • 用于旋转的四元数,每个分量的范围都在(-1,1);
  • 每次旋转实际上需要两个四元数的参与,即q和 q ∗ q^* q
  • 所有用于旋转的四元数都是单位四元数,即它们的模是1.

与旋转的关系

在Unity里,transform组件中有一个变量名为rotation,它的类型就是四元组。

旋转的另外两种表示方式

  1. 矩阵旋转
    优点:旋转轴是任意的
    缺点:旋转其实只需知道一个向量(3个变量)和一个角,共四个变量,但是矩阵法却需要16个元素。做算法运算时,计算量大,空间和时间复杂度大
  2. 欧拉旋转
    优点:很容易理解,形象直观
    表示方便,只需3个值(分别是x、y、z的旋转角度),但是其效率还是不如四元数。
    缺点:坐标轴是固定的-》造成了万向锁。

更多相关知识请参见博文参考博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值