【GAMES101】图形学学习记录——变换

在正式开始学习计算机图形学之前,我们需要了解一些关于线性代数的基础知识。

点和向量的表示

我们通常用一个二维列向量来表示一个点的位置或者一个向量,例如:

矩阵的表示

矩阵的表示方式:

图形的变换

矩阵和向量之间可以进行加减乘除等运算,这里省略。我们知道,一个图形可以用一系列点来表示。如果我们想要对一个图形进行变换操作,我们只需要让这个图形的所有点移动到我们想要的位置即可。我们可以通过对这些点进行运算来实现这个操作。

镜像变换

alt text
对于这个变换,我们只需要让x或y值变成相反数。

切变

alt text

旋转

alt text

平移

alt text

齐次坐标

我们可以注意到,前三个变换都是用变换矩阵乘以点的形式,而平移操作需要我们用点的向量加上平移矩阵。有没有一种方法可以将平移操作也统一成乘法形式?

答案是齐次坐标

我们将所有n维的矩阵和向量都加上一个维度,例如:

我们可以在多出来的这一个维度中表示平移的操作,例如:

而对于向量矩阵来说,多出来的这个维度也有其作用。例如下面这个向量:

当w=0时,这个向量矩阵表示的就是一个向量。当w=1时,这个向量矩阵表示的是一个点。

而当w!=0且w!=1时,它表示的如下的点:

对于前三种变换矩阵,我们只需要加上一个维度即可,例如旋转:

变换的组合

如果我们想对对象进行一系列变换,我们只需要依次对对象左乘变换即可,但是要注意顺序。

例如,我们想对X做变换M1,M2,…Mn,乘积的顺序应该是:

补充

三维空间中的旋转公式

绕x轴:

绕y轴:

绕z轴:

绕任意轴的旋转公式

观测变换

现在我们已经知道了在一个坐标空间中的物体是如何摆放和移动的,但是如果我们想要表示出我们是如何“看到”它们的,我们要怎么做呢?

例如,在现实生活中,火车的轨道是平行的,但是我们却能看到铁轨在远处交汇。通过观测变换,我们就能知道摄像机在指定的位置看到的物体是什么样的。

观测变换(MVP变换)分为:模型变换(模型摆放的位置)、视图变换(确定摄像机的位置和方向,并保证所有物体跟随摄像机移动)、投影变换(将三维空间的物体投影到二维平面上。

我们的重点是投影变换

相机的摆放

以(0,0,0)为原点,将摄像机放在原点上,并以y轴方向为摄像机的上方向,使摄像机看向-z方向。这样摆放符合右手坐标系。

投影变换

投影变换分为两种:正交投影和透视投影。前者不遵循近大远小法则,而后者较为接近我们现实中看到的情况。

正交投影

假设物体在如下的立方体中,我们要做的是将其移动到正则立方体((-1,1)^3)中。之后如何将其显示在屏幕上,我们会在下一节“光栅化”中讲解。
alt text

这个过程比较简单,我们只需要将其移动到原点,再进行缩放。变换矩阵如下:

透视投影及推导

在透视投影中,我们要投影的是如下所示的一个棱台。直接做投影比较困难,但是我们可以将其“压缩”成一个长方体后再对其做正交投影。下面给出推导过程。

所谓的压缩是指我们需要将较远的大平面压缩为和n处小平面相同大小。这里有三个原则:

  • 近平面上的任意一点都不会发生改变
  • 远平面上的任意一点的z值都不会发生改变
  • 远平面上的中心点不会发生改变

alt text

对于任意一点(x,y,z),我们假设它投影到近平面后的点为(x’,y’,z’),从侧面看去,可以得到如下的一个相似三角形:
alt text

根据相似三角形的性质,我们可以得到:

同理可得:

因此,我们的目标就是找到一个变换矩阵使得(x,y,z)转换成(x’,y’,x’),也可以写做如下形式:

通过这两个关系,我们已经可以推出变换矩阵的一部分。

剩下的一个行向量,我们需要用之前说过的三个原则来解出。

对于近平面上的点,它在变换前和变换后的z值都是n,可以得出:

对于远平面上的点,它在变换前和变换后的z值都是f,同理可得:

通过这两个方程,我们就可以解出A和B的值:

最终得到的变换矩阵如下:

之后的过程和正交投影相同。