这里回顾GAMES101 Lecture 3,变换。

课程主页:

课程作业:

课程视频:

为什么学习变换

模型变换(modeling)

常见的例子有旋转和伸缩。

视图变换(viewing)

从3D到2D的投影:

2D变换

矩阵表示

很容易将常见的2D变换利用矩阵表示。

伸缩变换

反射变换

Shear矩阵(变换)

旋转

小结

线性变换等价于矩阵操作,一般的形式为:

齐次坐标

引子

之前提到,线性变换等价于矩阵变换,那么什么操作不是线性变换呢,一个常见的例子是平移变换:

其矩阵表示为:

更一般的,如下形式的仿射变换都不是线性变换:

那么是否有一个统一的方式表示仿射变换呢?回答是肯定的,答案就是齐次坐标。

基本概念

齐次坐标的思路是增加一个左边:

  • 对于2D point,利用$(x, y,1)^T$表示;
  • 对于2D vector,利用$(x,y,0)^T$表示;

那么平移变换可以在齐次坐标下表示为:

讨论

在齐次坐标下,有如下等式成立:

  • vector + vector = vector;
  • point - point = vector;
  • point + vector = point;
  • point + point = 两点的中点;
    • 利用性质$(x, y, w)=(x/w, y/w, 1)$;

2D变换的齐次坐标表示

仿射:

伸缩:

旋转:

平移:

逆变换

对于变换(矩阵)$\mathbf M$,引入逆变换(矩阵)$\mathbf M^{-1}$,图示如下:

复合变换

对于更复杂的变换,可以使用复合变换,例如:

可以先平移再旋转:

也可以先旋转再平移:

注意变换顺序是有影响的,即:

这是因为变换对应了矩阵,复合变换对应了矩阵乘法,而矩阵乘法是没有交换律的。

对于一般的复合变换,可以将其分解为一系列仿射变换$A_1,A_2,\ldots,A_n$,那么复合变换为:

例子

对于绕着点$c$旋转的变换,可以用如下方式得到:

  1. 将旋转中心平移到原点;
  2. 旋转;
  3. 将旋转中心平移回去;

图示如下:

变换如下:

3D变换

对于3D变换,依然使用其次坐标:

  • 对于3D point,利用$(x, y,z,1)^T$表示;
  • 对于3D vector,利用$(x,y,z,0)^T$表示;
  • 通常其次坐标$(x,y,z, w)$对应于点$(x/w, y/w, z/w)$;

仿射变换的矩阵形式为: