专业的编程技术博客社区

网站首页 > 博客文章 正文

旋转的表达方式:四元数(四元数旋转向量)

baijin 2024-09-05 11:31:33 博客文章 7 ℃ 0 评论

概述

旋转的表达方式有:欧拉角,旋转矩阵,轴角,四元素等。游戏开发中最常用的表达方式:四元数。

欧拉角

欧拉角使用翻转角(roll),俯仰角(pitch)和航向角(yaw)分别表示x,y,z轴上的旋转角度,其取值范围为(或者 )。

欧拉角容易出现的问题:

  1. 不易在任意方向的旋转轴插值;
  2. 万向节死锁;
  3. 旋转的次序无法确定。

万向节死锁

万向节死锁,数学上叫做奇异性。


一个典型的万向锁问题可以表述如下:先heading45°再pitch90°,这与先pitch90°再bank45°是等价的。事实上,一旦选择±90°作为pitch角,就会导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。这种角度为±90°的第二次旋转使得第一次和第三次旋转的旋转轴相同的现象,称作万向锁。

可以使用手中的手机感受一下。先将手机屏幕面于地面平行,绕Z轴旋转任意角度,然后将手机向上仰90度,使得屏幕面和地面垂直,这样不论如何,第三次旋转和第一次旋转等价。

轴角

轴角用一个以单位矢量定义的旋转轴,再加上一个标量定义的旋转角来表示旋转。通常的表示为?? ,前三个表示轴,最后一个表示角度,非常直观和紧凑。

轴角的局限:

  1. 不能进行简单的插值;
  2. 轴角形式的旋转不能直接施于点或矢量,必转换至矩阵或者四元素;

四元数

四元素感觉上就是轴角的进化,也是使用一个3维向量表示转轴和一个角度分量表示绕此转轴的旋转角度,即,其中

表示旋转轴的矢量,表示绕此轴的旋转角度。四元数中的每个数都是经过“处理”的轴和角,与轴角描述的“四元组”并不是一个空间下的东西,首先是一个3维坐标下的矢量,而则是级坐标下的角度,简单的将他们组合到一起并不能保证他们插值结果的稳定性,因为他们无法归一化,所以不能保证最终插值后得到的矢量长度(经过旋转变换后两点之间的距离)相等。而四元数是在统一的4维空间中(四元数(Quaternion)的线性空间意义 - 知乎),方便归一化来插值,又能方便的得到轴、角。在3D图像的信息数据处理领域,用四元数再合适不过了。相比于矩阵,四元素也只要存储4个浮点数,优势很明显。

四元数相关计算

乘法

给定两个四元数p和q,分别代表旋转P和Q,则乘积pq表示两个旋转的合成(即旋转了Q之后再旋转P),并不是用加法。四元数的乘法定义如下,利用简单的分配律就是了:

求模

单位化

求共轭

求逆

对于向量逆的定义,

对于单位四元素,分母为1,所以

用四元数旋转矢量

给定一个矢量,再给定一个旋转的单位四元素,让旋转

首先将改写成四元素的形式,接下来要旋转须先用乘以矢量,再后乘以??

对于旋转多个四元数,比如旋转矩阵。则

注意顺序。

四元数插值

四元数最大的优势是可以方便地进行插值。

线性插值

线性插值最为简单,效率也很高。

给定两个旋转四元素和??代表旋转和旋转,找到旋转到旋转之间的的旋转:

注意,这里的??实际上是沿弦上走了??,而不是在球面上走??,这样就会导致当??以恒定速度改变时,角度的变化并非恒定。


为了解决这个问题,就出现了球面线性插值。

球面线性插值

给定四元素??和??,则

其中??是两个四元数的夹角,

四元数的转换

四元数转欧拉角

欧拉角转四元数

四元数转旋转矩阵

旋转矩阵转四元数

假设旋转矩阵为

由“四元数转旋转矩阵”可知以下等式关系:

情况1:

四元数为

其中,要求满足

特殊情况

如果,即,则求解四元数的过程为如下3种情况。

情况2:

如果

情况3:

如果

情况4:

如果

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表