最爱午后红茶

3D transformations

日期图标
2023-04-13

三维坐标的变换跟二维类似,也会有缩放、旋转、平移等变换,同样需要引入齐次坐标:

  • 3Dpoint=(x,y,z,1)T3D point = (x, y, z, 1)^T
  • 3Dvector=(x,y,z,0)T3D vector = (x, y, z, 0)^T

同样的,如果出现 (x,y,z,w)(x, y, z, w),且 w0w \neq 0,那它的含义就是 (x/w,y/w,z/w,1)(x/w, y/w, z/w, 1)。而三维空间中的仿射变换描述为齐次坐标是这样:

  • [xyz]=[abctxdeftyghitz0001][xyz]\left[\begin{matrix}x' \\ y'\\ z'\end{matrix}\right] = \left[\begin{matrix}a & b & c & t_x\\ d & e & f & t_y\\ g & h &i & t_z \\ 0 & 0 & 0 & 1\end{matrix}\right]\left[\begin{matrix}x \\ y\\ z\end{matrix}\right]

其中 [abcdefghi]\left[\begin{matrix}a & b & c\\ d & e & f\\ g & h &i\end{matrix}\right] 是三维坐标中的线性变换,而 [txtytz]\left[\begin{matrix}t_x \\ t_y\\ t_z\end{matrix}\right] 是三维坐标下的平移变换

提问:上述仿射变换的齐次坐标表示中包含了两个变换(线性变换 + 平移),那么从顺序上看是哪个变换先执行呢?
回答:从仿射变换的定义其实就能看出,是先进行线性变换,后进行平移变换。也即上述仿射变换的齐次坐标表示也等同于:

  • [xyz]=[abcdefghi][xyz]+[txtytz]\left[\begin{matrix}x' \\ y' \\ z'\end{matrix}\right] = \left[\begin{matrix}a & b & c\\ d & e &f \\ g & h &i\end{matrix}\right]\left[\begin{matrix}x \\ y \\ z\end{matrix}\right] + \left[\begin{matrix}t_x \\ t_y \\ t_z\end{matrix}\right]

Scale & Translation

齐次坐标下的三维空间的缩放和平移跟二维的类似:

  • Scale: S(sx,sy,sz)=(sx0000sy0000sz00001)S(s_x, s_y, s_z) = \left(\begin{matrix}s_x & 0 & 0 &0\\0 & s_y & 0 & 0\\0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1\end{matrix}\right)
  • Translation: T(tx,ty,tz)=(100tx010ty001tz0001)T(t_x, t_y, t_z) = \left(\begin{matrix}1 & 0 & 0 & t_x \\0 & 1 & 0 & t_y\\0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1\end{matrix}\right)

Rotation

特殊情况的绕轴旋转

齐次坐标下的三维空间的旋转比二维的要复杂一些,下面是分别绕 xx 轴、yy 轴、zz 轴旋转的公式:

  • Rx(α)=(10000cosαsinα00sinαcosα00001)R_x(\alpha) = \left(\begin{matrix}1 & 0 & 0 &0\\0 & cos{\alpha} & -sin{\alpha} & 0\\0 & sin{\alpha} & cos{\alpha} & 0 \\ 0 & 0 & 0 & 1\end{matrix}\right)
  • Ry(α)=(cosα0sinα00100sinα0cosα00001)R_y(\alpha) = \left(\begin{matrix}cos{\alpha} & 0 & sin{\alpha} &0\\0 & 1 & 0 & 0\\-sin{\alpha} & 0 & cos{\alpha} & 0 \\ 0 & 0 & 0 & 1\end{matrix}\right)
  • Rz(α)=(cosαsinα00sinαcosα0000100001)R_z(\alpha) = \left(\begin{matrix}cos{\alpha} & -sin{\alpha} & 0 &0\\sin{\alpha} & cos{\alpha} & 0 & 0\\0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{matrix}\right)

注意:这里的绕轴旋转均假设是逆时针旋转。

以绕 xx 轴旋转举例,绕 xx 轴旋转,就相当于保持 xx 不变,在 yzy-z 平面上旋转。

三维空间中绕 x 轴旋转(Rotaion around x)
图一:三维空间中绕 x 轴旋转

Rx(α)R_x(\alpha) 左上角 3×33 \times 3 的矩阵 (1000cosαsinα0sinαcosα)\left(\begin{matrix}1 & 0 & 0\\0 & cos{\alpha} & -sin{\alpha}\\0 & sin{\alpha} & cos{\alpha}\end{matrix}\right) 可以看出,其右下角 2×22 \times 2 的矩阵 (cosαsinαsinαcosα)\left(\begin{matrix}cos{\alpha} & -sin{\alpha}\\ sin{\alpha} & cos{\alpha}\end{matrix}\right) 就是二维 (yzy-z) 平面下的旋转矩阵。zz 轴类似处理;至于 yy 轴稍有区别,因为如果是绕 yy 轴旋转,旋转方向是 zz -> xx,而不是 xx -> zz,相当于在 xzx-z 平面上做顺时针旋转。

任意情况的旋转

任意三维空间下的旋转可以写成分别绕 xx 轴、yy 轴和 zz 轴旋转的组合:

  • Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)R_{xyz}(\alpha, \beta, \gamma) = R_x(\alpha)R_y(\beta)R_z(\gamma)

其中 α,β,γ\alpha, \beta, \gamma 在数学上又被称为欧拉角,而这也类比飞机模型中的三个绕轴旋转操作:yaw(偏航), pitch(倾斜度/俯仰), row(翻滚)

飞机模型中的绕轴旋转(yaw pitch roll)
图二:飞机模型中的绕轴旋转

可以看下动画直观感受一下(素材来自 欧拉角的理解(CSDN)):

偏航(yaw)
图三:偏航(yaw)
倾斜度/俯仰(pitch)
图四:倾斜度/俯仰(pitch)
翻滚(roll)
图五:翻滚(roll)

通过这三个绕轴旋转的组合,就可以把飞机调整到任何需要的朝向。而罗德里格旋转公式(Rodrigues' rotation formula)则可以计算出任意的绕(nn)轴旋转:

  • R(n,α)=cos(α)I+(1cos(α))nnT+sin(α)(0nznynz0nxnynz0)R(n, \alpha) = cos(\alpha)\Iota + (1 - cos(\alpha))nn^{\Tau} + sin(\alpha)\left(\begin{matrix}0 & -n_z & n_y\\ n_z & 0 & -n_x \\ -n_y & n_z & 0\end{matrix}\right)

前面说 Rx(α)R_x(\alpha) 表示的绕 xx 轴旋转是过该轴原点的。而 R(n,α)R(n, \alpha) 的 n 表示任意轴也是过原点的(我理解是这样,后面如果发现理解错了再更正)。如果绕轴旋转的轴有起点和方向的话,那任意轴就不一定过原点了。从 2D transformations 中关于变换分解的那块描述我们知道二维坐标下绕任意点旋转可以分解成平移 + 绕原点旋转 + 平移。三维空间下也可以做类似的处理,道理是一样的。闫老师在这里给出了公式的推理,当然,也可以在网上搜寻其他的推理过程。

扩展概念:四元数万向锁。这些就先不展开了,后面如果碰到要用了再详细分析。

* 未经同意不得转载。