logo资料库

quaternion.pdf

第1页 / 共72页
第2页 / 共72页
第3页 / 共72页
第4页 / 共72页
第5页 / 共72页
第6页 / 共72页
第7页 / 共72页
第8页 / 共72页
资料共72页,剩余部分请下载后查看
复数
定义
性质
复数加减法
复数乘法
复数的模长与共轭
复数相乘与2D旋转
复数的极坐标型
旋转的复合
三维空间中的旋转
旋转的分解
v||的旋转
v⟂的旋转
v的旋转
四元数
性质
模长(范数)
四元数加法和减法
标量乘法
四元数乘法
矩阵形式
Graßmann积
纯四元数
逆和共轭
四元数与3D旋转
v⟂的旋转
v||的旋转
v的旋转
3D旋转的矩阵形式
旋转的复合
双倍覆盖
指数形式
四元数插值
3D空间旋转变化量 vs. 四元数4D向量空间夹角
Lerp, Nlerp, Slerp
Lerp
Nlerp
Slerp
双倍覆盖带来的问题
Squad
三次Bézier曲线
de Casteljau算法
Squad
Squad应用
附加主题、参考资料以及拓展阅读
李群
特殊正交群
特殊酉群
参考资料及拓展阅读
几何代数(Clifford代数)
参考资料及拓展阅读
二重四元数
参考资料及拓展阅读
四元数
论文及文章
书籍
视频
代码
附录1:四元数的指数映射
附录2:左手坐标系统下的旋转
右手坐标系 – 左手定则
左手坐标系 – 右手定则
坐标系转换
四元数与三维旋转 Krasjet 这篇文章的主要目的就是简单讨论一下四元数(Quaternion)与三维旋转之间的关 系.虽然网上四元数相关的资料有很多了,但是我好像一直没找到令我满意的,所以 就想自己来写一篇. 目前很多资料都使用了比较抽象的方式来解释这一主题,而且在某一些点上讲得不 是很清楚.因为 3D空间还是在我们理解范围之内的,所以四元数与三维旋转的一些 关系可以直接使用一些基础的几何学和线性代数的知识来推导和理解,并不会那么 复杂.我们在大部分的时间中也会采用这一方式来理解四元数,如果你对更抽象的 内容感兴趣,我在最后也非常浅显地提到一些,但是它们不是我们的重点. 因为我们主要的侧重点会偏向几何以及计算机图形学中的应用,如果你是因为在学 习物理学或者抽象代数来看这篇文章,我不确定这篇文章能否帮助到你.当然,我在 最后提到的一些拓展阅读可能还是有一点用的. 我在写这篇文章的时候顺手写了一些用于 Demo的 MATLAB/Octave代码,并且将 动画导出为了 GIF,你可以在 GitHub上找到它们:https://github.com/Krasjet/quaternion 因为写完之后仅仅只校对过一遍_(:з」∠)_,所以肯定会存在很多错误.如果你发 现有任何错误或者对内容有什么意见,请直接到 GitHub的 Issues里报告. 本文采用「CC BY-NC-SA 4.0」协议,在共享的时候请记得署名以及采用相同的协 议,并且不要用于商业用途. 1 复数 在介绍四元数与 3D 旋转之间的关系之前,我们先来讨论一下复数(Complex Number)的一些性质以及它与 2D旋转之间的关系.四元数的很多性质在很多层面 上都与复数非常类似,所以理解复数的一些性质会对理解四元数非常有帮助. 因为复数不是我们的重点,下面对复数的讨论不会非常全面.如果你对复数已经非 常了解了,也可以直接跳到第二章. 1
1.1 定义 任意一个复数 z ∈ C都可以表示为 z = a + bi的形式,其中 a, b ∈ R而且 i2 = −1. 我们将 a 称之为这个复数的实部(Real Part),b 称之为这个复数的虚部(Imaginary Part). 因为 z = a + bi其实就是对于 {1, i}这个基(Basis)的线性组合(Linear Combination), 我们也可以用向量来表示一个复数: 24a 35 z = b 因为这个向量有两个元素,我们可以使用复平面上的一个点来表示一个复数.复平 面的横坐标 Re代表它的实部,纵坐标 Im代表它的虚部: Im bi z = a + bi Re a 1.2 性质 1.2.1 复数加减法 如果我们有两个复数 z1 = a + bi, z2 = c + di,它们的和就是分量相加的结果: z1 + z2 = (a + c) + (b + d)i 同理,如果要对它们相减,直接将分量相减就可以了: z1 − z2 = (a − c) + (b − d)i 虽然复数的加减法还有很多其它的性质,但是加减法并不是我们的重点,我们需要 关注的是复数的乘法. 2
1.2.2 复数乘法 如果有两个复数 z1 = a + bi, z2 = c + di,我们可以使用分配律来计算它们的乘积: z1z2 = (a + bi)(c + di) = ac + adi + bci + bdi2 因为 i2 = −1,这可以进一步化简为 z1z2 = ac − bd + adi + bci = ac − bd+ (bc + ad)i 如果仔细观察你就能发现,复数相乘的结果其实也是一个矩阵与向量相乘的结果, 也就是说: z1z2 = ac − bd+ (bc + ad)i 24a −b 35 3524c 35是用向量的形式来表示的 z2,而左侧的 24a −b = b a d d 24c 24a −b 35则是 z1 的矩阵形式. 35这个矩阵所代表的变换是等 右侧的 我们可以发现,复数相乘这个运算,其实是与 价的(虽然复数与这个矩阵的关系远远不止这些,但是你只需要理解它所代表的变 换与复数的乘法运算之间的关系就可以了). 那么,在矩阵形式下,复数与复数的相乘也可以表示为矩阵的相乘,如果我们有两 b a b a 3
个复数 z1 = a + bi, z2 = c + di,那么与 z1z2 所代表的变换则可以表示为: 24a −b 3524c −d 35 24ac − bd −(bc + ad) d b a c 35 bc + ad ac − bd z1z2 = = 注意,复数的相乘是满足交换律的,如果你自己尝试一下,就会发现 z1z2 与 z2z1 是等价的: 35 = z1z2 c a b d z2z1 = 24c −d 3524a −b 35 24ac − bd −(bc + ad) 除此之外,我们来看一下一些特殊复数的矩阵形式: 241 0 35 = I 35 240 −1 ac − bd bc + ad 0 1 1 = = i = 1 0 (a = 1, b = 0) (a = 0, b = 1) 240 −1 1 0 35,如 可以看到,实数单位 1与单位矩阵是等价的.而虚数单位 i则等价于 果我们尝试对它进行平方,可以发现: 35 = −I = −1 35240 −1 240 −1 24−1 35 = i2 = i · i = 0 0 −1 1 0 1 0 即便是在矩阵形式下,i2 与 −1其实也是等价的,这进一步展示了复数与这一矩阵 形式的关联. 4
1.2.3 复数的模长与共轭 在进行下一步的讨论之前,我们先定义一下复数的模长(Magnitude).如果 z = a + bi, 那么它的模长为: p ∥z∥ = a2 + b2 接下来,我们定义复数的共轭(Conjugate).如果 z = a + bi,那么它的共轭为: z = a − bi 我们只需要翻转 z虚部的符号就能得到它的共轭了.如果我们尝试计算 zz,我们会 发现: zz = (a + bi)(a − bi) = a2 − abi + abi + b2 = a2 + b2 = ∥z∥2 所以,一个复数的模长又可以通过乘积的方式进行计算: ∥z∥ = √ zz 35矩阵所作出的变 1.3 复数相乘与 2D旋转 现在,我们回到之前的话题,既然与复数的相乘代表着 换,那这种变换代表着什么呢? 实际上,如果我们对这个矩阵进行一些变形,这个问题就很容易解决了: 24a −b 24 a√ 我们将矩阵中每一个元素都除以了模长 ∥z∥ = 外面.经过这一变换,我们只需要观察一下复平面就能够解答之前的问题了: 35 = −b√ a2+b2 a√ a b 24a −b 35 a2 + b2 a2+b2 b√ a2+b2 √ p b a a2+b2 a2 + b2,并将这一项提到了矩阵 5
Im bi z = a + bi √ a2 + b2 θ a b a Re b a sin(θ) p 35 = 可以看到,∥z∥ 正是复数 z 与坐标轴所形成的三角形的斜边长,而 a, b 分别为三 角形的两个直角边.如果将斜边与实数轴 Re 正方向的夹角记为 θ 的话,按照三角 函数的定义可以得出 a√ a2+b2 = sin(θ),这个角度 θ 其实就是 a2+b2 = cos(θ),且 b√ atan2(b, a).知道了这些,原矩阵就可以变形为: 24a −b 24cos(θ) − sin(θ) 35 24cos(θ) − sin(θ) 35 24cos(θ) − sin(θ) 35 3524cos(θ) − sin(θ) 24∥z∥ (对任意方形矩阵 A = IA) = ∥z∥ · I = ∥z∥ a2 + b2 35 cos(θ) cos(θ) cos(θ) 0 sin(θ) cos(θ) 24∥z∥ 35则是我们熟悉的 2D旋转矩阵. 24cos(θ) − sin(θ) 我们将原本的矩阵变形为了两个变换矩阵的复合,其中左边的 矩阵,而右边的 即便你不认识后面的那个旋转矩阵也没有关系,我们可以看看这个矩阵对两个基 35是缩放 0 ∥z∥ cos(θ) sin(θ) 0 sin(θ) sin(θ) 0 ∥z∥ = 6
0 sin(θ) = sin(θ) 35 0 0 0 b a 0 sin(θ) cos(θ) 0 ∥z∥ 0 ∥z∥ 240 1 241 0 241 35和 35241 35 第一步首先将 35: 241 35的变换效果.首先是 24∥z∥ 35 = 35241 24a −b 3524cos(θ) − sin(θ) 24∥z∥ 3524cos(θ) 35变换到了 24cos(θ) 35的位置,也就是逆时针旋转了 θ度,接下来: 24∥z∥ 3524cos(θ) 35 = 24∥z∥ cos(θ) 24cos(θ) 24∥z∥ cos(θ) 35缩放了 ∥z∥倍,变为 缩放矩阵将 35: 240 逆时针旋转了 θ 度,并缩放了 ∥z∥倍. 接下来是 24∥z∥ 24a −b 24∥z∥ 24− sin(θ) 35 变换到了 3524cos(θ) − sin(θ) 3524− sin(θ) 35 的位置,这同样是逆时针旋转了 θ 度, 35 35.总的来说,就是对 35240 35 35240 35 = 241 35 ∥z∥ sin(θ) ∥z∥ sin(θ) sin(θ) cos(θ) 0 ∥z∥ 0 ∥z∥ b a 1 0 ∥z∥ 0 sin(θ) 0 0 = 0 1 35 cos(θ) sin(θ) 1 0 240 1 这里,第一步将 见下图: cos(θ) 7
Im sin(θ) cos(θ) θ sin(θ) Re θ cos(θ) cos(θ) ∥z∥ cos(θ) 24− sin(θ) 24−∥z∥ sin(θ) 35缩放为 35.这样等于是将整个坐 第二步的变换同样会将 标系逆时针旋转了 θ 角,并缩放了 ∥z∥倍. 所以,复数的相乘其实是旋转与缩放变换的复合.如果有一个复数 z = a + bi,那 么 z 与任意一个复数 c 相乘都会将 c 逆时针旋转 θ = atan2(b, a) 度,并将其缩放 ∥z∥ = 如果 ∥z∥ = 1,也就是说 a2 + b2 = 1,即这个复数可以用一个单位向量来表示,那 么这个复数所代表的几何意义就完全只有旋转了.所留下来的部分就只有纯粹的旋 转矩阵: a2 + b2 倍. √ 24cos(θ) − sin(θ) 35 z = sin(θ) cos(θ) 如果我们想让 2D空间中任意一个向量 v旋转 θ 度,那么我们就可以使用这个矩阵 对 v进行变换: Theorem 1: 2D旋转公式(矩阵型) 24cos(θ) − sin(θ) 24cos(θ) − sin(θ) 35这个旋转矩阵如果写成复数形式的话就是 cos(θ) + 35 v cos(θ) sin(θ) = v ′ 注意,其实 i sin(θ). sin(θ) cos(θ) 8
分享到:
收藏