本篇文章主要是解释 如何从数学上刻画 一个向量绕一个轴旋转 得到最终的向量的表达式,主要内容可参见Rodrigues formula.

从2D 谈起

不失一般性,我们考虑下图, 向量1,坐标为 p 1 = ( x , y ) \mathbf{p}_1 =(x,y) p1​=(x,y) 绕 x x x轴 (水平轴) 逆时针旋转 θ \theta θ角得到向量2,坐标为 p 2 = ( x ′ , y ′ ) \mathbf{p}_2 = (x',y') p2​=(x′,y′),此时向量2在该坐标系下的表示如下图所示

Observation 1

该公式的推导非常简单,假设向量1与 x x x轴的夹角为 α \alpha α, 利用三角函数求和公式阔以直接得到,故此不再赘述。
观察 p ′ = ( x ′ , y ′ ) \mathbf{p}' = (x',y') p′=(x′,y′)的表达式,跟欧拉公式
e j θ = cos ⁡ ( θ ) + j sin ⁡ ( θ ) , j 2 = − 1 e^{j \theta} = \cos(\theta) + j \sin(\theta), j^2= -1 ejθ=cos(θ)+jsin(θ),j2=−1
联系起来,将 x x x轴看作 R e Re Re实轴, y y y轴看作 I m Im Im轴,此时向量1可以用一个复数 p 1 = x + j y p_1 = x+ jy p1​=x+jy表示,类似地, 向量2可以用一个复数 p 2 = x ′ + j y ′ p_2= x'+ j y' p2​=x′+jy′表示。利用复数乘法, 向量2可以表示为
p 2 = e j θ p 1 p_2 = e^{j \theta} p_1 p2​=ejθp1​
此时,我们得到了复数乘法的几何意义,即:一个复数与 e j θ e^{j \theta} ejθ 相乘,这个复数的相位发生了 θ \theta θ的逆时针偏转。
(注:值得注意的是,规定旋转的正方向很重要,这里我们规定逆时针为正方向,否则会造成模糊)

Observation 2

为了方便3D的公式, 我们需要将向量 p 2 \mathbf{p}_2 p2​写成向量 p 1 \mathbf{p}_1 p1​的形式,观察上图中的公式
[ x ′ y ′ ] = cos ⁡ ( θ ) [ x y ] + sin ⁡ ( θ ) [ − y x ] = cos ⁡ ( θ ) p + sin ⁡ ( θ ) p ⊥ \begin{align} \left[ \begin{matrix} x' \\ y' \end{matrix} \right] = \cos(\theta) \left[ \begin{matrix} x \\ y \end{matrix} \right] + \sin(\theta) \left[ \begin{matrix} -y \\ x \end{matrix} \right] = \cos(\theta) \mathbf{p} + \sin(\theta) \mathbf{p}_{\perp} \end{align} [x′y′​]=cos(θ)[xy​]+sin(θ)[−yx​]=cos(θ)p+sin(θ)p⊥​​​
其中 p ⊥ = [ − y , x ] T \mathbf{p}_{\perp} = [-y,x]^T p⊥​=[−y,x]T 与向量 p \mathbf{p} p垂直,并且 ∥ p ⊥ ∥ 2 = ∥ p ∥ \| \mathbf{p}_{\perp} \|_2 = \| \mathbf{p}\| ∥p⊥​∥2​=∥p∥。由此可见,旋转后的向量可以由旋转前的向量与其垂直的向量线性表示出来。

3D 向量旋转

Rodrigues formula

当我们考虑3维空间如下图所示, 选定旋转轴( rotation axis),其方向向量记为 n ^ \mathbf{\hat n} n^, 并且其模值为1。

Special case

为了方便解释, 我们可以先考虑一个简单的场景: 向量 v → \mathbf{ \overrightarrow{v}} v 垂直于旋转轴, 记逆时针旋转 θ \theta θ之后的向量为 v → ′ \mathbf{ \overrightarrow{v}}' v ′。

如何得到 v → ′ \mathbf{ \overrightarrow{v}}' v ′的表达式呢?
为了回答这个问题,我们首先注意到 向量 v → ′ \mathbf{ \overrightarrow{v}}' v ′ 跟向量 v → \mathbf{ \overrightarrow{v}} v 位于同一平面,我们可以用之前得到2D下的公式 来刻画旋转后的向量 v → ′ \mathbf{ \overrightarrow{v}}' v ′, 但是怎么得到跟向量 v → \mathbf{ \overrightarrow{v}} v 正交的向量呢?
注意到旋转轴 n ^ \mathbf{\hat n} n^垂直于 v → \mathbf{ \overrightarrow{v}} v , 根据右手法则,向量 n ^ \mathbf{\hat n} n^叉乘 v → \mathbf{ \overrightarrow{v}} v 得到
( n ^ × v → ) ⊥ v → , and  ∥ ( n ^ × v → ) ∥ = ∥ n ^ ∥ v → ∥ sin ⁡ ( π / 2 ) = ∥ v → ∥ (\mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) \perp \mathbf{ \overrightarrow{v}} , {\text {and } } \| (\mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) \| = \| \mathbf{\hat n}\| \mathbf{ \overrightarrow{v}}\| \sin(\pi/2) = \| \mathbf{ \overrightarrow{v}}\| (n^×v )⊥v ,and ∥(n^×v )∥=∥n^∥v ∥sin(π/2)=∥v ∥
因此,向量 v → ′ \mathbf{ \overrightarrow{v}}' v ′可以表示为
v → ′ = cos ⁡ ( θ ) v → + sin ⁡ ( θ ) ( n ^ × v → ) \mathbf{ \overrightarrow{v}}' = \cos(\theta) \mathbf{ \overrightarrow{v}} + \sin(\theta) (\mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) v ′=cos(θ)v +sin(θ)(n^×v )
由此可见,3D空间中,旋转后的向量 依然可以表示为原向量于其垂直向量的线性组合,且其系数分别为 cos ⁡ ( θ ) \cos(\theta) cos(θ)和 sin ⁡ ( θ ) \sin(\theta) sin(θ)。

任意向量的旋转

在上个小节,我们讨论了向量 v → \mathbf{ \overrightarrow{v}} v 垂直于旋转轴 n ^ \mathbf{\hat n} n^的特殊情况, 若向量 v → \mathbf{ \overrightarrow{v}} v 于旋转轴不垂直呢?如下图所示,向量 v → \mathbf{ \overrightarrow{v}} v 可以做分解为
v → = v → ∥ + v → ⊥ \mathbf{ \overrightarrow{v}} = \mathbf{ \overrightarrow{v}} _{\parallel} + \mathbf{ \overrightarrow{v}} _{\perp} v =v ∥​+v ⊥​

同理,旋转后的向量也可以由如下式子合成
v → ′ = v → ′ ∥ + v → ′ ⊥ \mathbf{ \overrightarrow{v}'} = \mathbf{ \overrightarrow{v}'} _{\parallel} + \mathbf{ \overrightarrow{v}'} _{\perp} v ′=v ′∥​+v ′⊥​
即,我们只需要找到对应的
v → ′ ∥ ↦ v → ∥ and  v → ′ ⊥ ↦ v → ⊥ \mathbf{ \overrightarrow{v}'} _{\parallel} \mapsto \mathbf{ \overrightarrow{v}} _{\parallel} \text{ and } \mathbf{ \overrightarrow{v}'} _{\perp} \mapsto \mathbf{ \overrightarrow{v}} _{\perp} v ′∥​↦v ∥​ and v ′⊥​↦v ⊥​
的关系式,再拼起来就可以了。
乍一看好像多了步骤,但其实仔细看看就知道, v → ∥ \mathbf{ \overrightarrow{v}} _{\parallel} v ∥​绕旋转轴不改变其方向和大小,而 v → ⊥ \mathbf{ \overrightarrow{v}} _{\perp} v ⊥​的公式我们已经从之前的special case中得到了。 也就是说
v → ′ = v → ′ ∥ + v → ′ ⊥ = v → ∥ + cos ⁡ ( θ ) v → ⊥ + sin ⁡ ( θ ) ( n ^ × v → ⊥ ) = ( a ) v → ∥ + cos ⁡ ( θ ) ( v → − v → ∥ ) + sin ⁡ ( θ ) ( n ^ × v → ) = cos ⁡ ( θ ) v → + ( 1 − cos ⁡ ( θ ) ) v → ∥ + sin ⁡ ( θ ) ( n ^ × v → ) = ( b ) cos ⁡ ( θ ) v → + ( 1 − cos ⁡ ( θ ) ) ( n ^ ⋅ v → ) n ^ + sin ⁡ ( θ ) ( n ^ × v → ) \begin{align} \mathbf{ \overrightarrow{v}'} =& \mathbf{ \overrightarrow{v}'} _{\parallel} + \mathbf{ \overrightarrow{v}'} _{\perp} \\ =&\mathbf{ \overrightarrow{v}} _{\parallel} + \cos(\theta) \mathbf{ \overrightarrow{v}} _{\perp} + \sin(\theta) ( \mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} _{\perp} ) \\ \stackrel{(a)}=& \mathbf{ \overrightarrow{v}} _{\parallel} + \cos(\theta) ( \mathbf{ \overrightarrow{v}} - \mathbf{ \overrightarrow{v}} _{\parallel} ) + \sin(\theta) ( \mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) \\ =& \cos(\theta) \mathbf{ \overrightarrow{v}} + (1-\cos(\theta)) \mathbf{ \overrightarrow{v}} _{\parallel} + \sin(\theta) ( \mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) \\ \stackrel{(b)}=& \cos(\theta) \mathbf{ \overrightarrow{v}} + (1-\cos(\theta)) \big( \mathbf{\hat n} \cdot \mathbf{ \overrightarrow{v}} \big) \mathbf{\hat n} + \sin(\theta) ( \mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) \end{align} v ′===(a)==(b)​v ′∥​+v ′⊥​v ∥​+cos(θ)v ⊥​+sin(θ)(n^×v ⊥​)v ∥​+cos(θ)(v −v ∥​)+sin(θ)(n^×v )cos(θ)v +(1−cos(θ))v ∥​+sin(θ)(n^×v )cos(θ)v +(1−cos(θ))(n^⋅v )n^+sin(θ)(n^×v )​​

等号(a)中利用了向量分解
v → ⊥ = v → − v → ∥ \mathbf{ \overrightarrow{v}} _{\perp} = \mathbf{ \overrightarrow{v}} - \mathbf{ \overrightarrow{v}} _{\parallel} v ⊥​=v −v ∥​
而等号(b)中利用向量
v → ∥ = ( n ^ ⋅ v → ) n ^ \mathbf{ \overrightarrow{v}} _{\parallel} = \big( \mathbf{\hat n} \cdot \mathbf{ \overrightarrow{v}} \big) \mathbf{\hat n} v ∥​=(n^⋅v )n^
(这里很简单,因为 v → ∥ \mathbf{ \overrightarrow{v}} _{\parallel} v ∥​方向与 n ^ \mathbf{\hat n} n^相同,而其大小可以由两个向量的点积(即 投影)得到。由此,我们得到了Rodrigues 公式
v → ′ = cos ⁡ ( θ ) v → + ( 1 − cos ⁡ ( θ ) ) ( n ^ ⋅ v → ) n ^ + sin ⁡ ( θ ) ( n ^ × v → ) \mathbf{ \overrightarrow{v}'} = \cos(\theta) \mathbf{ \overrightarrow{v}} + (1-\cos(\theta)) \big( \mathbf{\hat n} \cdot \mathbf{ \overrightarrow{v}} \big) \mathbf{\hat n} + \sin(\theta) ( \mathbf{\hat n} \times \mathbf{ \overrightarrow{v}} ) v ′=cos(θ)v +(1−cos(θ))(n^⋅v )n^+sin(θ)(n^×v )
记忆公式的时候,只要回想一遍推导过程就好了。

Reference:
[1] https://www.youtube.com/watch?v=q-ESzg03mQc&t=6s
[2]https://krasjet.github.io/quaternion/quaternion.pdf

Rodrigues formula相关推荐

  1. 罗德里格斯公式推导(Rodrigues‘ Formula)超全,超详细

    Rodrigues' Formula Derive eω^t=E+ω^t+(ω^t)22!+(ω^t)33!+...(1)e^{\hat\omega t}=E+\hat\omega t+\frac{( ...

  2. 罗德里格斯公式(Rodrigues Formula)

    罗德里格斯公式(Rodrigues's Formula) 摘要:罗德里格斯公式推导过程.主要参考Krasjet的文档,写的非常详细,如果想看更加详细的过程,建议去看看文档.这里主要做了简洁浓缩,方便快 ...

  3. 详解基于罗德里格斯(Rodrigues)公式由旋转向量到旋转矩阵的 Python 实现

    文章目录 旋转向量 rotation vector 旋转矩阵 rotation matrix 罗德里格斯公式 Rodrigues' formula 基于 Python 和 NumPy 实现 Rodri ...

  4. 关于空间坐标转化的若干论文

    空间三维坐标转换原理及实现 本文详细介绍了不同空间三维坐标系之间坐标转换的两种数学模型,即线性模型和非线性模型,并对两种模型进行比较.为实现三维坐标系之间的相互转换,基于线性模型,编制了相关的可视化程 ...

  5. lie group and computer vision : 李群、李代数在计算机视觉中的应用

      在多视角几何中,特别是在一些恢复相机运动轨迹的模型中,我们需要将相机的旋转和平移表示出来.通常情况下,我们都是在欧几里得空间中用R和t来进行相应的运算得到相机轨迹.然而,在很多论文中,作者们却喜欢 ...

  6. matlab y轴旋转面,Mayavi:绕y轴旋转

    你需要一些数学知识.好的,这里是如何做到这一点的代码,这不是最好的代码,但我想让它自解释.我用罗德里格斯公式在三维旋转来实现这一点,azéu new和el_new是您的新视角.改变θ的值以获得不同的视 ...

  7. Python 模拟Laguerre Polynomial拉盖尔多项式

    首先我们从Rodrigues' formula出发: L n ( α ) ( x ) = x − α e

  8. 由frankmocap得到的.pkl文件转为.bvh或者.fbx

    需求 由Frankmocap所得到的.pkl文件转为blender里的.bvh或者Maya里的.fbx Frankmocap_github项目地址 2D转3D转.bvh可以看VideoTo3dPose ...

  9. 人体捕捉:《SMPL-X》

    <Expressive Body Capture: 3D Hands, Face, and Body from a Single Image> 作者:Georgios Pavlakos 主 ...

最新文章

  1. 关于亿级账户数据迁移,你应该试试这种方法...
  2. C#编写最小化时隐藏为任务栏图标的Window appllication
  3. 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以
  4. linearlayout设置最大高度_一句话掌握一消建筑高度计算方法,先收藏!
  5. 会导致所有者权益减少的项目是_处置固定资产而发生的净损失为什么会导致所有者权益减少...
  6. LeetCode 460. LFU缓存(哈希双链表)
  7. 钱学森做的试卷你见过吗?100年前学霸的笔记,工整得像打印的
  8. java searchterm_elasticsearch – 弹性搜索:“Term”,“Match Phrase”和“Query String”之间的差异...
  9. python中getopt函数_Python中getopt()函数的使用
  10. 自然语言处理NLP技术里程碑、知识结构、研究方向和机构导师(公号回复“NLP总结”下载彩标PDF典藏版资料)
  11. Visio里如何画树状图?
  12. C++:动态规划DP;
  13. linux 提升管理员权限命令,​cmd怎么用命令直接提升到管理员权限|cmd原有权限提升方法...
  14. 教育技术与c语言程序设计,2018年华东师范大学885教育技术与C程序设计考研复习资料...
  15. 印象笔记中可以使用html语言吗,印象笔记使用方法
  16. 【Java学习之代码学习】 Prog28_打印出杨辉三角形的问题
  17. UCenter 1.6 数据字典
  18. java中集合的分类以及集合的选择
  19. CodeBlocks控制台中文乱码
  20. JavaScript是单线程还是多线程?

热门文章

  1. 判断输入的字符串是否全为英文字母
  2. CSDN中使用Mermaid绘制思维导图
  3. SCAU 18923 二叉树的直径
  4. 基于Java+Vue+uniapp微信小程序实现餐厅校园订餐平台
  5. H.265和4K超高清时代到来
  6. 人工智能(AI)、机器学习、深度学习 的关系
  7. Flutter No MediaQuery ancestor could be found starting from the context that was passed to MediaQuer
  8. ML之LoR:逻辑回归LoR算法的简介、应用、经典案例之详细攻略
  9. Parliament UVA - 668 贪心
  10. CSDN博客——如何进入专栏并创建自己的专栏