四元数与三维旋转

简介: 四元数与三维旋转

四元数与三维旋转

在之前学习了:

复数与二维旋转

三维旋转

四元数的定义与性质

之后,我们再继续探究一下“四元数与三维旋转”之间的联系。

我们之前说过“轴角式”三维旋转方式为:将一个向量V 沿着一个用单位向量所定义的旋转轴u 旋转θ 度,那么我们可以通过把向量V分为V⊥与V||的两个分量,然后可以通过对这两个分量分别进行旋转,获得旋转之后的V⊥与V||,将它们相加就是旋转后的向量V。

我们把之前所涉及到的向量定义为下述所示的纯四元数:

那么我们就能够得到:

三维旋转中类似的,我们还是分开讨论V与V||的情况。

V的旋转

三维旋转中,我们推导过,如果一个向量V正交于旋转轴u,那么

我们可以很容易地将前面的V和V’ 替换为v和v (即,向量替换为四元数)。但是后面的叉乘不能直接替换,我们之前了解过四元数Graßmann 积(四元数的定义与性质)的形式。

对于两个纯四元数:

有:

则类似的:

又因为V和旋转轴u正交,所以u · v⊥ = 0,即上式可以变换为:

将上述等式及之前定义的纯四元数代入到

中,可以得到:

因为四元数的乘法遵守分配律,我们可以继续变换这个等式:

如果我们把上式左侧括号内看成是一个四元数,则就可以看成是两个四元数的乘积。假设,上式变换为:

其中,

把上式中的 q 变换为四元数

也就是说,如果旋转轴u 的坐标为:[𝑢𝑥 𝑢𝑦 𝑢𝑧]’,旋转角为θ,那么完成这一旋转所需要的四元数 q 可以构造为:

这样我们就完成了对V的旋转:

对于上述描述的四元数q,还有一个性质:

所以,我们上述构造出来的 q 其实是一个单位四元数,即||q|| = 1。所以本四元数乘法的几何意义是一个纯旋转(无缩放)。

V||的旋转

对于平行于旋转轴 u 的V||,其绕着旋转轴u的旋转不会有任何变换。即:

V的旋转

综合上述两个分量的旋转,我们能够得到V’的结果:

为了进一步化简,我们证明以下几个引理:

使用Graßmann 积和一些三角恒等式:

其实上述引理的几何意义为,如果绕着同一个旋转轴u连续旋转θ 度两次,那么所做出的变换等同于直接绕着u 旋转2θ 度。

有了这个引理,我们再来回忆一下四元数逆的定义:

接着,对原本的旋转公式进行变形,引入一个变量p:

也就是:

代入v’中:

能够注意到,p和q相同,也是一个单位四元数。具有如下性质:

代入等式后:

为了进一步化简上式,我们继续证明两个引理:

利用Graßmann 积,先计算等式的左边:

接下来计算等式的右边:

第二个定理:

证明过程如下,分别计算左右两边:

现在,我们就能对之前的公式做出最后的变形了:

而式中:V + V|| = V,所以,上式继续变换为:

到此为止,我们就推导出了四元数与3D 旋转之间的关系。虽然我们之前将

𝑣 划分成了两个分量V和V||,但是推导的结果其实并没有包含V和 V||。最终可以总结出以下定理:

换句话说,如果我们有𝑞 = [cos(θ), sin(θ)u],那么𝑣′ = 𝑞𝑣𝑞∗ 可以将v 沿

着u 旋转2θ 度。

旋转四元数的分解

除了上述介绍的推导过程之外,我们再了解一点四元数拆分成对应旋转角度和旋转轴的过程。

首先,所有的旋转四元数的实部都只是一个角度的余弦值,假设有一个单位

四元数𝑞 = [𝑎, b]。如果我们想要提取它所对应旋转的角度,那么我们可以直

接得到:

如果想要再获得旋转轴,那么只需要将b 的每一项都除以sin(θ/2)就可以了。

目录
相关文章
|
6月前
|
Python
平移
【5月更文挑战第15天】平移。
51 1
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
229 0
|
3月前
第4章-变换-4.3-四元数
第4章-变换-4.3-四元数
36 3
202309-1 坐标变换(其一)
202309-1 坐标变换(其一)
202309-2 坐标变换(其二)
202309-2 坐标变换(其二)
|
6月前
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
172 2
|
机器学习/深度学习 C++
C++实现实现逆时针旋转矩阵
C++实现实现逆时针旋转矩阵
C++实现实现逆时针旋转矩阵
|
数据可视化 API
|
机器学习/深度学习
旋转图像1
旋转图像1
82 0
|
图形学
Unity 之 获取物体的旋转角正确数值
不管父物体如何设置,都能获取到物体本身旋转角度的正确数值
1060 0