概念
四元数由三个虚部单位组成,分别为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′=pqq−1
其中,
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)}
q−1=N(q)q∗,由于u是单位向量,因此N(q)=1,即
q
−
1
=
q
∗
q^{-1}=q^*
q−1=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,w1w2−v1×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)} q−1=N(q)q∗
四元数旋转需要注意的地方
- 用于旋转的四元数,每个分量的范围都在(-1,1);
- 每次旋转实际上需要两个四元数的参与,即q和 q ∗ q^* q∗;
- 所有用于旋转的四元数都是单位四元数,即它们的模是1.
与旋转的关系
在Unity里,transform组件中有一个变量名为rotation,它的类型就是四元组。
旋转的另外两种表示方式
- 矩阵旋转
优点:旋转轴是任意的
缺点:旋转其实只需知道一个向量(3个变量)和一个角,共四个变量,但是矩阵法却需要16个元素。做算法运算时,计算量大,空间和时间复杂度大 - 欧拉旋转
优点:很容易理解,形象直观
表示方便,只需3个值(分别是x、y、z的旋转角度),但是其效率还是不如四元数。
缺点:坐标轴是固定的-》造成了万向锁。
1万+

被折叠的 条评论
为什么被折叠?



