文章目录
前言
前章节主要讲解了二维空间和三维空间常用的空间变换矩阵,主要包括:缩放、平移、旋转。但是之前说的旋转都是绕着标准x、y、z轴旋转,本章节主要带大家认识一下绕过原点的任意轴旋转公式,也叫做罗德里德斯旋转公式(Rodrigues rotation formula)。
正文
前置知识
1、一个点的坐标本质
在一个三维空间中,我们常说的 P = ( x ′ , y ′ , z ′ ) P = (x',y',z') P=(x′,y′,z′) 究竟代表什么含义?请看下图:
我们大家都知道只要有三个线性无关的基向量,那么这三个向量的线性组合就可以张成这个三维空间,因为它可以表示这个三维空间中的任意位置。而我们最常见的基向量,就是正交基向量,他们两两垂直,如上图所示,三个基向量如下:
x
^
=
(
1
,
0
,
0
)
T
y
^
=
(
0
,
1
,
0
)
T
z
^
=
(
0
,
0
,
1
)
T
\hat x = (1,0,0)^T\\ \hat y = (0,1,0)^T\\ \hat z = (0,0,1)^T\\
x^=(1,0,0)Ty^=(0,1,0)Tz^=(0,0,1)T
那么此时的P点的坐标,实际上表示对三个基向量的权重比例,最终表示为加权和,如下所示:
P ⃗ = x ′ x ^ + y ′ y ^ + z ′ z ^ \vec P = x' \hat x + y' \hat y + z' \hat z P=x′x^+y′y^+z′z^
上述公式也可以改写成矩阵和向量相乘的形式,如下:
P
⃗
=
[
1
0
0
0
1
0
0
0
1
]
(
x
′
y
′
z
′
)
\vec P = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix} \begin{pmatrix} x'\\ y'\\ z'\\ \end{pmatrix}
P=
100010001
x′y′z′
2、旋转的几何理解
假设现有一个任意的旋转矩阵 R = ( r 0 ⃗ , r 1 ⃗ , r 2 ⃗ ) R = (\vec{r_0},\vec{r_1},\vec{r_2}) R=(r0,r1,r2) ,有一任意点 P = ( x , y , z ) P = (x,y,z) P=(x,y,z), 假设P经过R变换后,得到 P ′ = ( x ′ , y ′ , z ′ ) P' = (x',y',z') P′=(x′,y′,z′)
于是咱们根据矩阵乘法的列视图理解,可以得到如下的等式:
P
′
=
(
x
′
y
′
z
′
)
=
R
P
=
x
r
0
⃗
+
y
r
1
⃗
+
z
r
2
⃗
P'= \begin{pmatrix} x'\\y'\\z'\\ \end{pmatrix} =RP = x\vec{r_0} + y\vec{r_1} + z\vec{r_2}
P′=
x′y′z′
=RP=xr0+yr1+zr2
因此,根据前面点坐标本质的说明,咱们可以这样理解:
- r 0 ⃗ 、 r 1 ⃗ 、 r 2 ⃗ \vec{r_0}、\vec{r_1}、\vec{r_2} r0、r1、r2 对应新坐标系下的三个基向量,按顺序对应新坐标系的x、y、z坐标轴
- 在新坐标系下也有一个P点
-
P
′
P'
P′点的本质含义:新的坐标系下的
P
P
P点,在原坐标系下的坐标是什么?可以结合如下图理解:
3、旋转的几何理解-延申
如果已知一个旋转矩阵R,我们没法直接看出新坐标系下的三个基向量,他可能是一个复杂的表达形式,这时候我们又想要知道,那怎么办呢?
答:分别令其与三个正交基: ( 1 , 0 , 0 ) T , ( 0 , 1 , 0 ) T , ( 0 , 0 , 1 ) T (1,0,0)^T,(0,1,0)^T,(0,0,1)^T (1,0,0)T,(0,1,0)T,(0,0,1)T,相乘即,得到的三个列向量结果就是新坐标下的基向量!
公式结论
已知过原点的旋转轴 u ⃗ = ( u x , u y , u z ) \vec u = (u_x,u_y,u_z) u=(ux,uy,uz),则右手系下,绕其旋转 θ \theta θ 角度的旋转矩阵为:
R θ = [ u x 2 ( 1 − cos θ ) + cos θ u x u y ( 1 − cos θ ) − u z sin θ u x u z ( 1 − cos θ ) + u y sin θ u x u y ( 1 − cos θ ) + u z sin θ u y 2 ( 1 − cos θ ) + cos θ u y u z ( 1 − cos θ ) − u x sin θ u x u z ( 1 − cos θ ) − u y sin θ u y u z ( 1 − cos θ ) + u x sin θ u z 2 ( 1 − cos θ ) + cos θ ] R_{\theta} = \begin{bmatrix} u_x^2(1 - \cos{\theta}) + \cos{\theta} & u_xu_y(1 - \cos{\theta}) - u_z\sin{\theta} & u_xu_z(1 - \cos{\theta}) + u_y\sin{\theta}\\ u_xu_y(1 - \cos{\theta}) + u_z\sin{\theta} & u_y^2(1 - \cos{\theta}) + \cos{\theta} & u_yu_z(1 - \cos{\theta}) - u_x\sin{\theta}\\ u_xu_z(1 - \cos{\theta}) - u_y\sin{\theta} & u_yu_z(1 - \cos{\theta}) + u_x\sin{\theta} & u_z^2(1 - \cos{\theta}) + \cos{\theta} \end{bmatrix} 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 ⃗ \vec{u} u, v ⃗ \vec{v} v 绕其旋转 θ \theta θ 角度,得到 v ′ ⃗ \vec{v'} v′,求 v ′ ⃗ \vec{v'} v′ 的坐标表示
2、思路描述:
示意图如下:
前提: 保证 u ⃗ \vec{u} u 已经归一化
步骤:
- 把 v ⃗ \vec{v} v 分解为平行于 u ⃗ \vec{u} u 的向量 v ∥ ⃗ \vec {v_\|} v∥ 及垂直于 u ⃗ \vec u u 的向量 v ⊥ ⃗ \vec {v_{\perp}} v⊥
- 计算 v ⊥ ⃗ \vec {v_{\perp}} v⊥ 围绕 u ⃗ \vec{u} u 旋转 θ \theta θ 角度后的向量 v ⊥ ′ ⃗ \vec {v'_{\perp}} v⊥′
- 将 v ⊥ ′ ⃗ \vec {v'_{\perp}} v⊥′ 和 v ∥ ⃗ \vec {v_\|} v∥ 相加,得到最后结果 v ′ ⃗ \vec{v'} v′
- 求解矩阵形式,只需要利用上述的旋转矩阵的引申,令 v ⃗ \vec v v 分别为 ( 1 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 0 , 0 , 1 ) (1,0,0),(0,1,0),(0,0,1) (1,0,0),(0,1,0),(0,0,1) 即可得到旋转矩阵的三个列向量!
3、分步推导:
(1)、计算
v
⃗
\vec v
v 在
u
⃗
\vec u
u 上的投影向量
v
∥
⃗
\vec {v_\|}
v∥
v
∥
⃗
=
(
v
⃗
⋅
u
⃗
)
u
⃗
\vec {v_\|} = (\vec v \cdot \vec u)\vec u
v∥=(v⋅u)u
(2)、计算向量
v
⊥
⃗
\vec {v_{\perp}}
v⊥
v
⊥
⃗
=
v
⃗
−
v
∥
⃗
=
v
⃗
−
(
v
⃗
⋅
u
⃗
)
u
⃗
\begin{align} \vec {v_{\perp}} &= \vec v - \vec {v_\|}\\ &= \vec v - (\vec v \cdot \vec u)\vec u \end{align}
v⊥=v−v∥=v−(v⋅u)u
(3)、从顶部观察截面,如下示意图:
构造向量 w ⃗ = u ⃗ × v ⊥ ⃗ \vec w = \vec u \times \vec {v_{\perp}} w=u×v⊥
由上图所示,咱们可以计算
v
⊥
′
⃗
\vec {v'_{\perp}}
v⊥′:
v
⊥
′
⃗
=
cos
θ
v
⊥
⃗
+
sin
θ
w
⃗
=
cos
θ
v
⊥
⃗
+
sin
θ
(
⃗
u
⃗
×
v
⊥
⃗
)
\begin{align} \vec {v'_{\perp}} &= \cos \theta \vec {v_{\perp}} + \sin \theta \vec w\\ &= \cos \theta \vec {v_{\perp}} + \sin \theta \vec (\vec u \times \vec {v_{\perp}}) \end{align}
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
⃗
)
\begin{align} \vec {v'_{\perp}} &= \cos \theta \vec {v_{\perp}} + \sin \theta \vec (\vec u \times \vec {v_{\perp}})\\ &= \cos \theta[\vec v - (\vec v \cdot \vec u)\vec u] + \sin \theta[\vec u \times(\vec v - (\vec v \cdot \vec u)\vec u)]\\ &= \cos \theta[\vec v - (\vec v \cdot \vec u)\vec u] + \sin \theta (\vec u \times \vec v) \end{align}
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
⊥
′
⃗
\vec {v'_{\perp}}
v⊥′ 和
v
∥
⃗
\vec {v_\|}
v∥ 相加,得到最后结果
v
′
⃗
\vec{v'}
v′
v
′
⃗
=
cos
θ
[
v
⃗
−
(
v
⃗
⋅
u
⃗
)
u
⃗
]
+
sin
θ
(
u
⃗
×
v
⃗
)
+
(
v
⃗
⋅
u
⃗
)
u
⃗
\vec{v'} = \cos \theta[\vec v - (\vec v \cdot \vec u)\vec u] + \sin \theta (\vec u \times \vec v) + (\vec v \cdot \vec u)\vec u
v′=cosθ[v−(v⋅u)u]+sinθ(u×v)+(v⋅u)u
(6)、求解矩阵形式,咱们令
v
⃗
=
(
1
,
0
,
0
)
T
\vec v = (1,0,0)^T
v=(1,0,0)T ,计算
v
⃗
′
\vec v'
v′,如下:
v
⃗
′
=
cos
θ
(
[
1
0
0
]
−
(
[
1
0
0
]
⋅
[
u
x
u
y
u
z
]
)
[
u
x
u
y
u
z
]
)
+
sin
θ
(
[
u
x
u
y
u
z
]
×
[
1
0
0
]
)
+
(
[
1
0
0
]
⋅
[
u
x
u
y
u
z
]
)
⋅
[
u
x
u
y
u
z
]
=
cos
θ
(
[
1
0
0
]
−
[
u
x
2
u
x
u
y
u
x
u
z
]
)
+
sin
θ
[
0
u
z
−
u
y
]
+
[
u
x
2
u
x
u
y
u
x
u
z
]
=
[
u
x
2
(
1
−
cos
θ
)
u
x
u
y
(
1
−
cos
θ
)
+
u
z
sin
θ
u
x
u
z
(
1
−
cos
θ
)
−
u
y
sin
θ
]
\begin{align} \vec v' &= \cos{\theta} \begin{pmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} -\begin{pmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} \cdot \begin{bmatrix} u_x \\ u_y \\ u_z \end{bmatrix} \end{pmatrix} \begin{bmatrix} u_x \\ u_y \\ u_z \end{bmatrix} \end{pmatrix} + \sin{\theta} \begin{pmatrix} \begin{bmatrix} u_x \\ u_y \\ u_z \end{bmatrix} \times \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} \end{pmatrix} + \begin{pmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} \cdot \begin{bmatrix} u_x \\ u_y \\ u_z \end{bmatrix} \end{pmatrix} \cdot \begin{bmatrix} u_x \\ u_y \\ u_z \end{bmatrix}\\ &=\cos{\theta} \begin{pmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} -\begin{bmatrix} u_x^2 \\ u_xu_y \\ u_xu_z \end{bmatrix} \end{pmatrix} +\sin{\theta} \begin{bmatrix} 0 \\ u_z \\ -u_y \end{bmatrix} +\begin{bmatrix} u_x^2 \\ u_xu_y \\ u_xu_z \end{bmatrix}\\ &=\begin{bmatrix} u_x^2(1-\cos{\theta}) \\ u_xu_y(1-\cos{\theta}) + u_z\sin{\theta} \\ u_xu_z(1-\cos{\theta}) - u_y\sin{\theta} \end{bmatrix} \end{align}
v′=cosθ
100
−
100
⋅
uxuyuz
uxuyuz
+sinθ
uxuyuz
×
100
+
100
⋅
uxuyuz
⋅
uxuyuz
=cosθ
100
−
ux2uxuyuxuz
+sinθ
0uz−uy
+
ux2uxuyuxuz
=
ux2(1−cosθ)uxuy(1−cosθ)+uzsinθuxuz(1−cosθ)−uysinθ
以此类推,咱们也可以分别得到第二列和第三列的基向量,将其拼起来得到最终旋转矩阵:
R
u
,
θ
=
[
u
x
2
(
1
−
cos
θ
)
+
cos
θ
u
x
u
y
(
1
−
cos
θ
)
−
u
z
sin
θ
u
x
u
z
(
1
−
cos
θ
)
+
u
y
sin
θ
u
x
u
y
(
1
−
cos
θ
)
+
u
z
sin
θ
u
y
2
(
1
−
cos
θ
)
+
cos
θ
u
y
u
z
(
1
−
cos
θ
)
−
u
x
sin
θ
u
x
u
z
(
1
−
cos
θ
)
−
u
y
sin
θ
u
y
u
z
(
1
−
cos
θ
)
+
u
x
sin
θ
u
z
2
(
1
−
cos
θ
)
+
cos
θ
]
R_{u,\theta} = \begin{bmatrix} u_x^2(1 - \cos{\theta}) + \cos{\theta} & u_xu_y(1 - \cos{\theta}) - u_z\sin{\theta} & u_xu_z(1 - \cos{\theta}) + u_y\sin{\theta}\\ u_xu_y(1 - \cos{\theta}) + u_z\sin{\theta} & u_y^2(1 - \cos{\theta}) + \cos{\theta} & u_yu_z(1 - \cos{\theta}) - u_x\sin{\theta}\\ u_xu_z(1 - \cos{\theta}) - u_y\sin{\theta} & u_yu_z(1 - \cos{\theta}) + u_x\sin{\theta} & u_z^2(1 - \cos{\theta}) + \cos{\theta} \end{bmatrix}
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θ
结尾:喜欢的小伙伴可以点点关注+赞哦
希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!