3D变换

三维矩阵变换

你可以使用一个4×4的矩阵将任何点变换到另一个点。下面的例子中,我们用一个矩阵对点$(x, y, z)$进行变化,产生了一个新的点$(x’, y’, z’)$:

最常用的变换包括:平移(translation),旋转(rotation)和缩放(scaling)。你可以将这些变换合并起来,组成一个矩阵,同时进行几种变换。

平移

将一个点$(x, y, z)$平移到另一个点$(x’, y’, z’)$:

旋转

将一个点$(x, y, z)$沿$x-$轴进行旋转,得到了一个新的点$(x’, y’, z’)$:

沿$y-$轴进行旋转:

沿$z-$轴进行旋转:

缩放

矩阵旋转

欧拉角旋转

偏航角:yaw

偏航角yaw是绕$z$轴逆时针旋转$\alpha$,对应的旋转矩阵是

俯仰角: pitch

俯仰角pitch是绕$y$轴逆时针旋转$\beta$,对应的旋转矩阵是

滚转角: roll

滚转角roll是绕$x$轴逆时针旋转$\gamma$,对应的旋转矩阵是

刚体变换

这三个旋转矩阵合起来便可以表达一个刚体变换[[3]][Yaw, pitch, and roll rotations]

四元数旋转

四元数、欧拉角、旋转矩阵的优点和缺点

  • 矩阵旋转
    • 优点:
      • 旋转轴可以是任意向量;
    • 缺点:
      • 旋转其实只需要知道一个向量+一个角度,一共4个值的信息,但矩阵法却使用了16个元素;
      • 而且在做乘法操作时也会增加计算量,造成了空间和时间上的一些浪费;
  • 欧拉旋转
    • 优点:
      • 很容易理解,形象直观;
      • 表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元数;
    • 缺点:
      • 之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;
      • 会造成万向节锁(Gimbal Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。这里有个视频可以直观的理解下;
      • 由于万向节锁的存在,欧拉旋转无法实现球面平滑插值
  • 四元数旋转
    • 优点:
      • 可以避免万向节锁现象;
      • 只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;
      • 可以提供平滑插值
    • 缺点:
      • 比欧拉旋转稍微复杂了一点点,因为多了一个维度;
      • 理解更困难,不直观;

参考

  1. 矩阵与变换
  2. 图形学复习要点
  3. Yaw, pitch, and roll rotations
  4. Creating a rotation matrix with pitch, yaw, roll using Eigen