也许,图形程序最通用的工具是改变或变换点和矢量的矩阵。在下一章中,我们将看到如何将一个矢量表示为一个单列的矩阵,以及如何通过与平方矩阵的乘法以不同的基来表示该矢量。我们还将描述如何使用这样的乘法来实现对矢量的改变,如缩放、旋转和平移。在本章中,我们从几何的角度回顾基本的线性代数,重点介绍在二维和三维情况下工作良好的直觉和算法。熟悉线性代数的读者可以跳过这一章。然而,即使对于这样的读者,也可能有一些启发性的花絮,例如行列式的发展以及奇异值和特征值分解的讨论。
另一种分解使用错切来表示非零旋转(Paeth,1990 年)。下面的特性可以实现这一点: $$\begin{bmatrix} \cos{\phi}&-\sin{\phi}\\sin{\phi}&\cos{\phi} \end{bmatrix}=\begin{bmatrix} 1& \frac{\cos{\phi}-1}{\sin{\phi}}\0&1 \end{bmatrix}\begin{bmatrix} 1& 0\ \sin{\phi}&1 \end{bmatrix}\begin{bmatrix} 1& \frac{\cos{\phi}-1}{\sin{\phi}}\0&1 \end{bmatrix}$$ 这种特殊的变换对光栅旋转非常有用,因为错切是一种对图像非常有效的光栅操作;它会带来一些锯齿、但不会留下漏洞。关键的一点是,如果我们取一个栅格位置 (i, j ),并对其施加水平错切,就会得到 $$\begin{bmatrix} 1&s\0&1 \end{bmatrix}\begin{bmatrix} i\j \end{bmatrix}=\begin{bmatrix} i+sj\j \end{bmatrix}$$ 如果我们将 sj 四舍五入为最接近的整数,这相当于将图像中的每一行都向侧边移动了一定的距离--每一行的距离都不同。由于每一行内的位移量相同,因此旋转后的图像不会出现间隙。类似的操作也适用于垂直错切。因此,我们可以轻松实现简单的光栅旋转。
曲面的法线垂直于曲面的切线平面。这些法线不会按照我们希望的方式变换当底层曲面被应用了一个变换矩阵。例如,如果曲面的点由矩阵 M 变换,则与曲面相切并乘以 M 的矢量 t 将与变换后的曲面相切。
然而,结果变换 M 的法线 n 也许不再和表面垂直。我们假设一个专用于法线的变换 N,它使得变换后的法线仍然与表面垂直。
解决这个问题的一种方法是:注意到一个表面法向量和一个切线向量是垂直的,所以它们的点积为零,用矩阵的形式表示为
我们已经介绍过使用矩阵 M 更改向量的方法。但是我们不能使用这种变换来移动对象,只能缩放和旋转。特别是,原点 (0, 0) 在线性变换下总是保持固定。
将平移添加到我们的线性变换系统中的一种方法是:简单地将独立的平移向量与每个变换矩阵相关联($y = Ax+b$),让矩阵负责缩放和旋转,向量负责平移。这是完全可行的,但是写起来很拗口,组合两个转换的规则并不像线性变换那样干净利落。
相反我们使用齐次坐标系将平移和之前的变换矩阵结合起来。将 2D 点表示为$[x, y, 1]^T$:
这种变换称为仿射变换(Affine Transformation),通过添加一个额外的维度来实现仿射变换的方法称为齐次坐标。齐次坐标不仅使基本变换的表达更加简练,而且该方案还使得如何组合两个仿射变换称为可能:简单地连续点乘矩阵。
当我们需要转换不是向量时,就会出现这种新形式主义的问题——针对表示位移或方向的量,他们的平移不应该改变其本身。幸运的是,我们可以通过将第三个坐标设置为零来安排这一点:
如果矩阵的左上角 2 × 2 条目中存在缩放/旋转变换,它将正常的应用。此外,零被复制到转换后的向量中,因此方向向量在变换后仍然是方向向量。
额外的(第三个)坐标将是 1 或 0,具体取决于我们正在描述位置还是方向。
齐次坐标(Homogeneous Coordinate)几乎普遍用于表示图形系统中的转换。特别是,齐次坐标是图形硬件中实现的渲染器的设计和操作的基础。齐次坐标也可以很容易地以透视的方式绘制场景,这是他们受欢迎程度的另一个原因。
齐次坐标可以被认为是处理平移的一种巧妙方法,但也有不同的几何解释。关键观察是:3D 点的 z 轴切变等价于 2D 齐次点的平移(当 z=1 时)。
我们可以将任意数量的 2D 剪切、2D 旋转和 2D 平移表示为一个复合 3D 矩阵。该矩阵的底行总是为 (0, 0, 1),因此我们不必存储它。
注意到任何一个矩阵可以通过 SVD 奇异值分解,分解为旋转矩阵和缩放矩阵的乘积: