我们在 1.8 ~1.8~ 1.8 节线性变换的矩阵 中介绍过如何通过矩阵对图像(向量)进行变换。计算机图形学正是基于这些矩阵变换来实现对图形的渲染及控制的。在实际应用中,操控图形的难点在于如何高效地处理复杂的变换组合及不同坐标系的转换。尤其是在三维图形中,对物体的透视投影、光照计算、阴影处理等都对矩阵运算的精度和效率提出了更高要求。此外,图形学还需结合几何信息和物理模拟,如碰撞检测、纹理映射等,这使得计算不仅局限于矩阵变换,还涉及对物体间交互的精确计算、纹理数据的采样与映射,以及光影效果的模拟等复杂运算。
2. 简单二维图形的表示
二维图形通常由一系列顶点(点)和线段构成,计算机通过存储这些点的坐标来绘制图形。线段可以通过这些顶点连接起来,形成简单的几何图形。为了方便计算,复杂的曲线通常会被一系列短直线段来近似。在这个过程中,字母和简单图形是二维图形表示的典型例子。
字母 N ~N~ N 可以通过若干个顶点来定义,每个顶点的坐标被存储在一个矩阵中。通过这些坐标以及它们的连接关系,字母 N ~N~ N 可以用线框模型表示。随后,基于这些顶点坐标,矩阵运算可以对其进行各种变换,如剪切、缩放和旋转等。
两个变换矩阵相乘得到的矩阵可以对图像进行复合变换 ,例如剪切矩阵 A ~\mathbf{A}~ A 乘以缩放矩阵 S ~\mathbf{S}~ S 得到复合变换矩阵 A S = [ 0.75 0.1875 0 1 ] ~\mathbf{AS}=\begin{bmatrix}0.75&0.1875\\0&1\end{bmatrix}~ AS = [ 0.75 0 0.1875 1 ] ,它可以对图形先进行缩小再进行剪切(其实两个操作是同时进行的)。我们在矩阵运算 一节讨论过,矩阵不满足交换律,改变相乘顺序会得到不一样的结果。
3. 齐次坐标的引入
上面对图形进行的变换,我们使用的是笛卡尔坐标系。在这种坐标系下,虽然旋转、缩放、剪切等可以通过矩阵乘法实现,但平移 无法通过矩阵运算处理。为了统一表示所有几何变换,计算机图形学引入了齐次坐标 ( H o m o g e n e o u s c o o r d i n a t e s ) ~(\mathbf{Homogeneous~coordinates})~ ( Homogeneous coordinates ) 。齐次坐标通过为二维空间增加一个额外的维度将 ( x , y ) ~(x,y)~ ( x , y ) 扩展为 ( x h , y h , w ) ~(x_h,y_h,w)~ ( x h , y h , w ) ,或为三维空间增加一个额外维度将 ( x , y , z ) ~(x,y,z)~ ( x , y , z ) 扩展为 ( x h , y h , z h , w ) ~(x_h,y_h,z_h,w)~ ( x h , y h , z h , w ) (注意:w ≠ 0 w\neq0~ w = 0 )。这样,我们就可以把平移变换转化为矩阵乘法。例如下面平移 R 2 ~\mathbb{R^2}~ R 2 中的图形时,我们可以在齐次坐标系下完成 ( w = 1 ) ~(w=1)~ ( w = 1 ) :
引入齐次坐标后,几何变换(如旋转、缩放、平移等)也可以通过矩阵乘法实现组合变换。下面我们展示如何使用齐次坐标进行一次复合变换(缩放、旋转、平移):
接下来,我们来看一下在三维空间中,物体如何在齐次坐标系下进行复合变换(如旋转和平移)。以绕 z − ~z- z − 轴旋转为例,在笛卡尔坐标系下的旋转矩阵形式如下:
R z ( θ ) = [ cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ] R_z(\theta) = \begin{bmatrix}
\cos \theta & -\sin \theta & 0 \\
\sin \theta & \cos \theta & 0 \\
0 & 0 & 1
\end{bmatrix} R z ( θ ) = cos θ sin θ 0 − sin θ cos θ 0 0 0 1
那么,它在齐次坐标系下的形式如下:
R z ( θ ) = [ cos θ − sin θ 0 0 sin θ cos θ 0 0 0 0 1 0 0 0 0 1 ] R_z(\theta) = \begin{bmatrix}
\cos \theta & -\sin \theta & 0 & \textcolor{#ff8200}{0} \\
\sin \theta & \cos \theta & 0 & \textcolor{#ff8200}{0} \\
0 & 0 & 1 & \textcolor{#ff8200}{0} \\
\textcolor{#ff8200}{0} & \textcolor{#ff8200}{0} & \textcolor{#ff8200}{0} & \textcolor{#ff8200}{1}
\end{bmatrix} R z ( θ ) = cos θ sin θ 0 0 − sin θ cos θ 0 0 0 0 1 0 0 0 0 1
在齐次坐标系下的平移矩阵形式如下:
T = [ 1 0 0 T x 0 1 0 T y 0 0 1 T z 0 0 0 1 ] T = \begin{bmatrix}
1 & 0 & 0 & \textcolor{#ff8200}{T_x} \\
0 & 1 & 0 & \textcolor{#ff8200}{T_y} \\
0 & 0 & 1 & \textcolor{#ff8200}{T_z} \\
\textcolor{#ff8200}{0} & \textcolor{#ff8200}{0} & \textcolor{#ff8200}{0} & \textcolor{#ff8200}{1}
\end{bmatrix} T = 1 0 0 0 0 1 0 0 0 0 1 0 T x T y T z 1
先旋转再平移的复合矩阵如下:
T ⋅ R z ( θ ) = [ cos θ − sin θ 0 T x sin θ cos θ 0 T y 0 0 1 T z 0 0 0 1 ] T \cdot R_z(\theta) = \begin{bmatrix}
\cos \theta & -\sin \theta & 0 & T_x \\
\sin \theta & \cos \theta & 0 & T_y \\
0 & 0 & 1 & T_z \\
0 & 0 & 0 & 1
\end{bmatrix} T ⋅ R z ( θ ) = cos θ sin θ 0 0 − sin θ cos θ 0 0 0 0 1 0 T x T y T z 1
当绕 z ~z z -轴旋转 90 ∘ ~90^\circ~ 9 0 ∘ ,平移 T x = 2 , T y = 2 , T z = 1 ~T_x=2,~T_y=2,~T_z=1~ T x = 2 , T y = 2 , T z = 1 时,在三维空间下的变换过程如下:
4. 透视投影
三维场景中的物体经过各种变换后,最终还是需要映射到二维平面上(也就是屏幕上),这时就需要引入图形学中的一个关键技术:透视投影 。透视投影模拟了人眼观看世界的方式——近处的物体看起来较大,而远处的物体则显得较小(近大远小)。为了实现这种视觉效果,通常采用透视投影矩阵 将三维物体的齐次坐标投影到二维视平面上,并通过透视除法 进行标准化,得到最终显示在屏幕上的二维坐标。
在三维图形学中,透视投影通过几何相似三角形关系 和矩阵运算相结合来实现。首先,我们通过几何推导,利用相似三角形的原理来计算投影后的二维坐标 x ∗ ~x^*~ x ∗ 和 y ∗ ~y^*~ y ∗ 。根据相似三角形的关系可得:
x ∗ = x 1 − z / d , y ∗ = y 1 − z / d x^*=\frac{x}{1-{z}/{d}}\quad ,\quad y^* = \frac{y}{1 - {z}/{d}} x ∗ = 1 − z / d x , y ∗ = 1 − z / d y
通过齐次坐标,我们可以将这些公式中的除法转换为矩阵操作。实际上,我们希望将齐次坐标 ( x , y , z , 1 ) ~(x,y,z,1)~ ( x , y , z , 1 ) 变换为 ( x 1 − z / d , y 1 − z / d , 0 , 1 ) \left( \frac{x}{1 - z/d}, \frac{y}{1 - z/d}, 0, 1 \right) ( 1 − z / d x , 1 − z / d y , 0 , 1 ) 。为了实现这一点,我们可以将透视投影定义为矩阵 P \mathbf{P} P ,它将齐次坐标进行变换。具体的矩阵形式为:
P = [ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 − 1 / d 1 ] \mathbf{P} = \begin{bmatrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & -{1}/{d} & 1
\end{bmatrix} P = 1 0 0 0 0 1 0 0 0 0 0 − 1 / d 0 0 0 1
当矩阵 P ~\mathbf{P}~ P 作用于齐次坐标 ( x , y , z , 1 ) ~(x,y,z,1)~ ( x , y , z , 1 ) 时,得到 ( x , y , 0 , 1 − z / d ) ~(x,y,0,1-z/d)~ ( x , y , 0 , 1 − z / d ) ,最后通过除以 w = 1 − z / d ~w=1-z/d~ w = 1 − z / d ,完成标准化,得出投影后的二维坐标。这其中的 d ~d~ d 表示的就是模拟人眼距离物体的距离,也被称为视点距离 或焦距 。例如当焦距 d ~d~ d 位于 ( 0 , 0 , 10 ) ~(0,0,10)~ ( 0 , 0 , 10 ) 的位置时,我们可以将 d ~d~ d 代入矩阵 P ~\mathbf{P}~ P 来计算物体(用矩阵 D \mathbf{D} D 描述)的齐次坐标系下的坐标位置 ( P D ) ~(\mathbf{PD})~ ( PD ) ,再通过标准化处理得到物体投射到屏幕上的位置,过程如下:
由于引入了齐次坐标,图形学中的主要矩阵运算基于是 4 × 4 ~4\times 4~ 4 × 4 矩阵的。因此,在实现物体运动、渲染、投影等复杂计算时,会涉及大量的 4 × 4 ~4\times 4~ 4 × 4 矩阵运算。高端图形处理器(如 G P U \mathbf{GPU} GPU )会专为 4 × 4 ~4\times 4~ 4 × 4 矩阵运算进行优化设计,使其每秒可执行数万亿次的矩阵乘法(例如 NVIDIA 的 A 100 ~A100 A 100 ),这样的性能保证了实时 3D 渲染、光线追踪,以及复杂的 VR 仿真等任务的实现。