
图形学初识--任意轴旋转矩阵(小白狂喜)
介绍任意轴旋转矩阵,包含:思路、推导,相比很多人发的帖子,这个更加容易懂,更直观
文章目录
前言
前章节主要讲解了二维空间和三维空间常用的空间变换矩阵,主要包括:缩放、平移、旋转。但是之前说的旋转都是绕着标准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θ
结尾:喜欢的小伙伴可以点点关注+赞哦
希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!
更多推荐
所有评论(0)