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

243 阅读3分钟

前言

前章节主要讲解了二维空间和三维空间常用的空间变换矩阵,主要包括:缩放、平移、旋转。但是之前说的旋转都是绕着标准x、y、z轴旋转,本章节主要带大家认识一下绕过原点的任意轴旋转公式,也叫做罗德里德斯旋转公式(Rodrigues rotation formula)。

正文

前置知识

1、一个点的坐标本质

在一个三维空间中,我们常说的 P=(x,y,z)P = (x',y',z') 究竟代表什么含义?请看下图:

在这里插入图片描述

我们大家都知道只要有三个线性无关的基向量,那么这三个向量的线性组合就可以张成这个三维空间,因为它可以表示这个三维空间中的任意位置。而我们最常见的基向量,就是正交基向量,他们两两垂直,如上图所示,三个基向量如下:

x^=(1,0,0)Ty^=(0,1,0)Tz^=(0,0,1)T\hat x = (1,0,0)^T\\ \hat y = (0,1,0)^T\\ \hat z = (0,0,1)^T\\

那么此时的P点的坐标,实际上表示对三个基向量的权重比例,最终表示为加权和,如下所示:

P=xx^+yy^+zz^\vec P = x' \hat x + y' \hat y + z' \hat z

上述公式也可以改写成矩阵和向量相乘的形式,如下:

P=[100010001](xyz)\vec P = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix} \begin{pmatrix} x'\\ y'\\ z'\\ \end{pmatrix}

2、旋转的几何理解

假设现有一个任意的旋转矩阵 R=(r0,r1,r2)R = (\vec{r_0},\vec{r_1},\vec{r_2}) ,有一任意点 P=(x,y,z)P = (x,y,z), 假设P经过R变换后,得到 P=(x,y,z)P' = (x',y',z')

于是咱们根据矩阵乘法的列视图理解,可以得到如下的等式:

P=(xyz)=RP=xr0+yr1+zr2P'= \begin{pmatrix} x'\\y'\\z'\\ \end{pmatrix} =RP = x\vec{r_0} + y\vec{r_1} + z\vec{r_2}

因此,根据前面点坐标本质的说明,咱们可以这样理解:

  • r0r1r2\vec{r_0}、\vec{r_1}、\vec{r_2} 对应新坐标系下的三个基向量,按顺序对应新坐标系的x、y、z坐标轴
  • 在新坐标系下也有一个P点
  • PP'点的本质含义:新的坐标系下的 PP点,在原坐标系下的坐标是什么?可以结合如下图理解: 在这里插入图片描述

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,相乘即,得到的三个列向量结果就是新坐标下的基向量!

公式结论

已知过原点的旋转轴u=(ux,uy,uz)\vec u = (u_x,u_y,u_z),则右手系下,绕其旋转 θ\theta​ 角度的旋转矩阵为:

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θ]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}

注:这里我们并没有按照最简洁的向量表示,而是给出一个大矩阵,因为这个和后面的推导相吻合,有利于观察!

公式推导

1、问题描述: 已知过原点O的旋转轴为u\vec{u}v\vec{v} 绕其旋转 θ\theta 角度,得到 v\vec{v'},求 v\vec{v'}​ 的坐标表示

2、思路描述:

示意图如下:

在这里插入图片描述

前提: 保证 u\vec{u} 已经归一化

步骤:

  1. v\vec{v} 分解为平行于 u\vec{u} 的向量 v\vec {v_\|} 及垂直于u\vec u 的向量 v\vec {v_{\perp}}
  2. 计算 v\vec {v_{\perp}} 围绕 u\vec{u} 旋转 θ\theta 角度后的向量 v\vec {v'_{\perp}}
  3. v\vec {v'_{\perp}}v\vec {v_\|} 相加,得到最后结果 v\vec{v'}
  4. 求解矩阵形式,只需要利用上述的旋转矩阵的引申,令 v\vec v 分别为(1,0,0),(0,1,0),(0,0,1)(1,0,0),(0,1,0),(0,0,1) 即可得到旋转矩阵的三个列向量!

3、分步推导:

(1)、计算 v\vec vu\vec u 上的投影向量 v\vec {v_\|}

v=(vu)u\vec {v_\|} = (\vec v \cdot \vec u)\vec u

(2)、计算向量v\vec {v_{\perp}}

v=vv=v(vu)u\begin{align} \vec {v_{\perp}} &= \vec v - \vec {v_\|}\\ &= \vec v - (\vec v \cdot \vec u)\vec u \end{align}

(3)、从顶部观察截面,如下示意图:

在这里插入图片描述

构造向量 w=u×v\vec w = \vec u \times \vec {v_{\perp}}

由上图所示,咱们可以计算 v\vec {v'_{\perp}}

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}

(4)、结合1、2、3得出的公式,咱们可以得到:

v=cosθv+sinθ(u×v)=cosθ[v(vu)u]+sinθ[u×(v(vu)u)]=cosθ[v(vu)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}

(5)、咱们,咱们回归到最上面的思路的最后一步,将 v\vec {v'_{\perp}}v\vec {v_\|} 相加,得到最后结果 v\vec{v'}

v=cosθ[v(vu)u]+sinθ(u×v)+(vu)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

(6)、求解矩阵形式,咱们令 v=(1,0,0)T\vec v = (1,0,0)^T ,计算v\vec v',如下:

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θ]\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}

以此类推,咱们也可以分别得到第二列和第三列的基向量,将其拼起来得到最终旋转矩阵:

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θ]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}

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

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