前言
前章节主要讲解了二维空间和三维空间常用的空间变换矩阵,主要包括:缩放、平移、旋转。但是之前说的旋转都是绕着标准x、y、z轴旋转,本章节主要带大家认识一下绕过原点的任意轴旋转公式,也叫做罗德里德斯旋转公式(Rodrigues rotation formula)。
正文
前置知识
1、一个点的坐标本质
在一个三维空间中,我们常说的 P=(x′,y′,z′) 究竟代表什么含义?请看下图:

我们大家都知道只要有三个线性无关的基向量,那么这三个向量的线性组合就可以张成这个三维空间,因为它可以表示这个三维空间中的任意位置。而我们最常见的基向量,就是正交基向量,他们两两垂直,如上图所示,三个基向量如下:
x^=(1,0,0)Ty^=(0,1,0)Tz^=(0,0,1)T
那么此时的P点的坐标,实际上表示对三个基向量的权重比例,最终表示为加权和,如下所示:
P=x′x^+y′y^+z′z^
上述公式也可以改写成矩阵和向量相乘的形式,如下:
P=100010001x′y′z′
2、旋转的几何理解
假设现有一个任意的旋转矩阵 R=(r0,r1,r2) ,有一任意点 P=(x,y,z), 假设P经过R变换后,得到 P′=(x′,y′,z′)
于是咱们根据矩阵乘法的列视图理解,可以得到如下的等式:
P′=x′y′z′=RP=xr0+yr1+zr2
因此,根据前面点坐标本质的说明,咱们可以这样理解:
- r0、r1、r2 对应新坐标系下的三个基向量,按顺序对应新坐标系的x、y、z坐标轴
- 在新坐标系下也有一个P点
- P′点的本质含义:新的坐标系下的 P点,在原坐标系下的坐标是什么?可以结合如下图理解:

3、旋转的几何理解-延申
如果已知一个旋转矩阵R,我们没法直接看出新坐标系下的三个基向量,他可能是一个复杂的表达形式,这时候我们又想要知道,那怎么办呢?
答:分别令其与三个正交基:(1,0,0)T,(0,1,0)T,(0,0,1)T,相乘即,得到的三个列向量结果就是新坐标下的基向量!
公式结论
已知过原点的旋转轴u=(ux,uy,uz),则右手系下,绕其旋转 θ 角度的旋转矩阵为:
Rθ=ux2(1−cosθ)+cosθuxuy(1−cosθ)+uzsinθuxuz(1−cosθ)−uysinθuxuy(1−cosθ)−uzsinθuy2(1−cosθ)+cosθuyuz(1−cosθ)+uxsinθuxuz(1−cosθ)+uysinθuyuz(1−cosθ)−uxsinθuz2(1−cosθ)+cosθ
注:这里我们并没有按照最简洁的向量表示,而是给出一个大矩阵,因为这个和后面的推导相吻合,有利于观察!
公式推导
1、问题描述: 已知过原点O的旋转轴为u,v 绕其旋转 θ 角度,得到 v′,求 v′ 的坐标表示
2、思路描述:
示意图如下:

前提: 保证 u 已经归一化
步骤:
- 把 v 分解为平行于 u 的向量 v∥ 及垂直于u 的向量 v⊥
- 计算 v⊥ 围绕 u 旋转 θ 角度后的向量 v⊥′
- 将 v⊥′ 和 v∥ 相加,得到最后结果 v′
- 求解矩阵形式,只需要利用上述的旋转矩阵的引申,令 v 分别为(1,0,0),(0,1,0),(0,0,1) 即可得到旋转矩阵的三个列向量!
3、分步推导:
(1)、计算 v 在 u 上的投影向量 v∥
v∥=(v⋅u)u
(2)、计算向量v⊥
v⊥=v−v∥=v−(v⋅u)u
(3)、从顶部观察截面,如下示意图:

构造向量 w=u×v⊥
由上图所示,咱们可以计算 v⊥′:
v⊥′=cosθv⊥+sinθw=cosθv⊥+sinθ(u×v⊥)
(4)、结合1、2、3得出的公式,咱们可以得到:
v⊥′=cosθv⊥+sinθ(u×v⊥)=cosθ[v−(v⋅u)u]+sinθ[u×(v−(v⋅u)u)]=cosθ[v−(v⋅u)u]+sinθ(u×v)
(5)、咱们,咱们回归到最上面的思路的最后一步,将 v⊥′ 和 v∥ 相加,得到最后结果 v′
v′=cosθ[v−(v⋅u)u]+sinθ(u×v)+(v⋅u)u
(6)、求解矩阵形式,咱们令 v=(1,0,0)T ,计算v′,如下:
v′=cosθ100−100⋅uxuyuzuxuyuz+sinθuxuyuz×100+100⋅uxuyuz⋅uxuyuz=cosθ100−ux2uxuyuxuz+sinθ0uz−uy+ux2uxuyuxuz=ux2(1−cosθ)uxuy(1−cosθ)+uzsinθuxuz(1−cosθ)−uysinθ
以此类推,咱们也可以分别得到第二列和第三列的基向量,将其拼起来得到最终旋转矩阵:
Ru,θ=ux2(1−cosθ)+cosθuxuy(1−cosθ)+uzsinθuxuz(1−cosθ)−uysinθuxuy(1−cosθ)−uzsinθuy2(1−cosθ)+cosθuyuz(1−cosθ)+uxsinθuxuz(1−cosθ)+uysinθuyuz(1−cosθ)−uxsinθuz2(1−cosθ)+cosθ
结尾:喜欢的小伙伴可以点点关注+赞哦
希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!