旋转三种表示详解

简介

我们来看一个简单的例子。

绕y轴旋转30o,三种表示。

  • 矩阵 : Ry(30o)=[cos30o0sin30o010sin30o0cos30o]
  • 欧拉角 :
    • Heading(Yaw/y)   =30
    • pitch(x)                    =0
    • bank(Roll/z)          =0
  • 四元数 : [0.9659   (0   0.2588   0)]

我们先要了解这三种旋转方式的优缺点:

任务/性质 旋转矩阵 欧拉角 欧拉角
在坐标系间(物体和惯性)旋转点 不能(必须转换到矩阵) 不能(必须转化到矩阵)
连接或增量旋转 能,但经常比四元数慢,小心矩阵蠕变的情况 不能 能,比矩阵快
插值 基本上不能 能,但可能遭遇万向锁或其他问题 Slerp,提供了平滑插值
易用程度
在内存或文件存储 9个数 3个数 4个数
对给定方位的表达方式是否唯一 不是,对同一方位有无数多种方法 不是,有两种方法,他们互相为互
可能导致非法 矩阵蠕变 任意三个数能构成合法的欧拉角 可能会出现误差累计,从而产生非法的四元数

矩阵

平面二维旋转

如下图,XY坐标系中,向量OP旋转β角度到了OP'的位置:
image
根据三角函数关系,可以列出向量OP与OP'的坐标表示形式:

{x=|OP|cosαy=|OP|sinα
{x=|OP|cos(α+β)y=|OP|sin(α+β)
对比上面个两个式子,将第2个式子展开:
{x=|OP|cos(α+β)=|OP|(cosαcosβsinαsinβ)=xcosβysinβy=|OP|sin(α+β)=|OP|(cosαsinβ+sinαcosβ)=xsinβ+ycosβ
用矩阵形式重新表示为:
[xy]=[cosβsinβsinβcosβ][xy]
这就是二维旋转的基本形式,中间的矩阵即二维旋转的旋转矩阵,坐标中的某一向量左乘该矩阵后,即得到这个向量旋转β角后的坐标。

三维旋转

三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用,只考虑绕X、Y、Z轴的旋转。

绕Z轴

参照上面的图,添加一个Z轴,则上面的二维旋转实际上就是绕Z轴的三维旋转
image
照搬上面的推导公式,并添加Z坐标的变换关系(实际是没有变),然后改写成矩阵形式,红色方框即为绕Z轴的旋转矩阵。
{x=xcosβysinβy=xsinβ+ycosβz=z
[xyz]=[cosβsinβ0sinβcosβ0000][xyz]

绕Y轴

绕Y轴旋转同理,这里直接改变坐标轴的符号表示,注意坐标顺序要符合右手系,我这里用颜色区分了不同的轴。最终的矩阵形式要进一步改写成XYZ的顺序。红色方框即为绕Y轴的旋转矩阵。
image
{x=zsinβ+xcosβy=yz=zcosβxsinβ
[xyz]=[cosβ0sinβ010sinβ0cosβ][xyz]

绕X轴

参照绕Y轴的推导,可以得到绕X轴的结果。红色方框即为绕X轴的旋转矩阵。
image
{x=xy=ycosβzsinβz=ysinβ+zcosβ
[xyz]=[1000cosβsinβ0sinβcosβ][xyz]

绕任意方向旋转

平凡的我们是不需要知道的。

欧拉角

四元数

四元数记法

q=[w,v]                其中v向量表示。
q=[w,(x,y,z)]    其中x,y,z都是复数。
q=[cosθ/2,(sinθ/2)nx,(sinθ/2)ny,(sinθ/2)nz]       其中n表示任意向量

复数

在介绍四元数与 3D 旋转之间的关系之前,我们先来讨论一下复数(Complex
Number)的一些性质以及它与 2D 旋转之间的关系.四元数的很多性质在很
多层面上都与复数非常类似,所以理解复数的一些性质会对理解四元数非常
有帮助.

复数表示形式:z=a+bi
我们可以用向量来表示这个复数:[ab]
在平面上我们表示为:R𝑒 代表它的实部,纵坐标 𝐼𝑚 代表它的虚部:
image

两个复数z1=a+bi,z2=c+di相乘:
z1z2=(a+bi)(c+di)=ac+adi+bci+bdi2
因为i2=1这可以进一步简化为:
z1z2=acbd+adi+bci=acbd+(bc+ad)i
如果仔细观察你就能发现,复数相乘的结果其实也是一个矩阵与向量相乘的
结果,也就是说:
z1z2=acbd+(bc+ad)i=[abba]=[cd]
右侧[cd]是用向量的形式来表示的 z2
左侧[abba]则是z1的矩阵。
我们可以发现,复数相乘这个运算,其实是与这个[abba]矩阵所代表的变换是等价的。
复数与复数的相乘也可以表示为矩阵的相乘:
z1z2=[abba][cddc]=[acbd(bc+ad)bc+adacbd]
除此之外,我们来看一下一些特殊复数的矩阵形式:
I=[1001]=1      (a=1,b=0)
i=[0110]      (a=0,b=1)
如果我们尝试对它进行平方,可以发现:
i2=ii=[0110][0110]=[1001]=I=1
复数的模长与共轭:
在进行下一步的讨论之前,我们先定义一下复数的模长(Magnitude).如
𝑧=𝑎+𝑏𝑖,那么它的模长为:
||z||=a2+b2
接下来,我们定义复数的共轭(Conjugate).如果 𝑧=𝑎+𝑏𝑖,那么它的共
轭:
z=abi

复数相乘与 2D 旋转

现在,我们回到之前的话题,既然与复数的相乘代表着[abba]矩阵所作出的变换,那这种变换代表着什么呢?
实际上,如果我们对这个矩阵进行一些变形,这个问题就很容易解决了
[abba]=a2+b2[aa2+b2ba2+b2ba2+b2aa2+b2]
我们将矩阵中每一个元素都除以了模长||z||=a2+b2并将这一项提到了矩阵外面.经过这一变换,我们只需要观察一下复平面就能够解答之前的问题了:
image

在此省略一万字,更多学习请点击下面链接!!
......

有关更多请参考

写的太好了
看视频学习就是轻松啊
精美壁纸

posted @   镜子-眼泪  阅读(1379)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
欢迎阅读『旋转三种表示详解』

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示