图形学初识--任意轴旋转矩阵(小白狂喜)

前言

前章节主要讲解了二维空间和三维空间常用的空间变换矩阵,主要包括:缩放、平移、旋转。但是之前说的旋转都是绕着标准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 =xx^+yy^+zz^

上述公式也可以改写成矩阵和向量相乘的形式,如下:
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 xyz

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= xyz =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(1cosθ)+cosθuxuy(1cosθ)+uzsinθuxuz(1cosθ)uysinθuxuy(1cosθ)uzsinθuy2(1cosθ)+cosθuyuz(1cosθ)+uxsinθuxuz(1cosθ)+uysinθuyuz(1cosθ)uxsinθuz2(1cosθ)+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 已经归一化

步骤:

  1. v ⃗ \vec{v} v 分解为平行于 u ⃗ \vec{u} u 的向量 v ∥ ⃗ \vec {v_\|} v 及垂直于 u ⃗ \vec u u 的向量 v ⊥ ⃗ \vec {v_{\perp}} v
  2. 计算 v ⊥ ⃗ \vec {v_{\perp}} v 围绕 u ⃗ \vec{u} u 旋转 θ \theta θ 角度后的向量 v ⊥ ′ ⃗ \vec {v'_{\perp}} v
  3. v ⊥ ′ ⃗ \vec {v'_{\perp}} v v ∥ ⃗ \vec {v_\|} v 相加,得到最后结果 v ′ ⃗ \vec{v'} v
  4. 求解矩阵形式,只需要利用上述的旋转矩阵的引申,令 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θ 0uzuy + ux2uxuyuxuz = ux2(1cosθ)uxuy(1cosθ)+uzsinθuxuz(1cosθ)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(1cosθ)+cosθuxuy(1cosθ)+uzsinθuxuz(1cosθ)uysinθuxuy(1cosθ)uzsinθuy2(1cosθ)+cosθuyuz(1cosθ)+uxsinθuxuz(1cosθ)+uysinθuyuz(1cosθ)uxsinθuz2(1cosθ)+cosθ

结尾:喜欢的小伙伴可以点点关注+赞哦

希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

  • 41
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值