Scale(缩放)

缩放变换

缩放可以对x和y采取相同的缩放比例,也可以不同。

Reflection(对称)

对称变换

Shear(剪切)

剪切变换

这里是水平方向上的切变。

Rotation(旋转)

旋转变换

这里是二维的旋转,并且我们默认它是绕着原点旋转,逆时针方向旋转。θ也就是默认为逆时针旋转的方向。

推导过程:

推导过程

并以此类推,计算出所有的参数。

Linear Transformations(线性变换)

线性变换

如果一个变换可以写成一个矩阵去乘输入的坐标,得到变换后的坐标,这个变换就是线性变换。上述介绍的几种变换都是线性变换。

Homogeneous coordinates(齐次坐标)

为什么要引入齐次坐标?有一种变换非常特殊:平移变换。

平移变换

我们会发现,它的变换非常简单,但是我们不可以像刚刚一样写成一个和矩阵相乘的形式了。我们只能写成:

平移变换的计算写法

所以,平移变换不是一个线性变换。但我们并不像为平移变换引入一种特殊的表示方式,我们希望的是将它们用同一种计算方法来表示。因此引入了齐次坐标的形式。

我们可以给二维的点和向量增加一个维度,增加的维度表示方式如下:

  • 2D point = (x, y, 1)
  • 2D vector = (x, y, 0)

这样的话,我们可以定义平移变换的计算如下:

齐次坐标下平移变换的矩阵计算

并且其他的变换也可以用这种形式表示。这里对于点和向量加上0或1也有其各自的原因,由于向量具有平移不变性,所以我们不希望它经过变换之后,发生了改变,因此这里向量最后一位是填0。

更深层次的一个理解是,在一个空间里面,一个向量加上一个向量遵循三角形法则,并且对应的坐标相加,也就是最后一位还是0。而如果空间中有一个点的坐标减去令一个点的坐标表示向量,那么得到的向量最后一位是0保持了原本的属性。一个点加上一个向量表示沿着向量移动,其最后一位也保持为1。所以在这些操作下,我们通过0或1的扩充,保留了他们原来的定义。

在此基础上,我们还可以扩充点加上的点的定义。首先,如下图所示:

齐次坐标下的一个点

在齐次坐标下,我们可以通过这种方式来表示一个点,无论w为何值都可以通过同除以w来表示同一个点,那么这个时候点和点相加,就会令w = 2,所以化为w = 1的形式时,也就是原来两点的中点。

上文的线性变换是一种仿射变换,通过齐次坐标,我们可以将它们都写成一个矩阵乘一个向量的形式,统一了所有的操作。

齐次坐标形式

可以看到,平移永远是写在最后一列的前两个数上,左上角的2×2矩阵则是原来的线性变换,最后一行永远都是0, 0, 1。

Inverse Transform(逆变换)

逆变换也就是原来的变换矩阵的逆矩阵。这一点也很好理解,一个矩阵乘它的逆矩阵会变成单位矩阵,也就是做了一个变换之后,再做一个逆变换,就变回了原来的样子。

Composite Transform(组合变换)

一个变换的例子

对于这个复杂变换,我们可以通过一系列的简单变换来做到。例如这个图中,我们可以先做一个逆时针旋转45°的变换,再做一个平移变换。但是我们不可以先平移再做上面提到的旋转,因为这个旋转是绕原点的。所以说,变换组合起来的顺序不一样,得到的结果也就不一样。这个可以通过矩阵的乘法来理解,变换就是在某一个向量前面乘一个矩阵,所以再变换就再乘一次,也就是说矩阵乘的顺序调换了,结果就不一样了,这是显然的,因为矩阵乘法不遵循交换律。

并且这里要注意,做对应的变换是左乘上这个变换的矩阵。也就是说会对所有的变换矩阵从右到左的去执行。

这个概念是可以推广的,当我们对一个点做相当多的变换,其表现形式如下:

应用到推广

并且,我们可以利用矩阵的结合律,将一系列的矩阵相乘结合乘一个矩阵去做每一个计算。这里得到的最终矩阵,就是这么多变换的统一,并且矩阵的大小依然是3×3。

我们也可以用变换的分解,来实现绕着非原点的某一个点去旋转。

我们可以先对所有的点做一个点C到原点的平移变换,这时左乘一个旋转矩阵,然后我们再做一个一开始的平移的逆变换,就实现了这个过程。

矩阵分解

3D Transforms

其实三维空间的变换,是对二维变换的类比,不过是多了一维的表达。依旧采取的是齐次坐标,这里就是用四个数来表示空间中的点或向量。如下图所示:

3D下的齐次坐标

使用一个4×4的矩阵来兼容仿射变换:

3D下的齐次坐标矩阵

最后一行永远是0, 0, 0, 1,最后一列的前三位表示位移,左上角的3×3矩阵则表示3维空间下的线性变换。

并且和2维空间一样,是先做线性变换,再做平移。