第一讲:计算机图形学概述 (Overview of Computer Graphics)

  • 什么是计算机图形学?

    • 使用计算机来合成(Synthesize)和操作视觉信息的技术。
  • 图形学的广泛应用:

    • 电子游戏、电影特效、动画、CAD设计、建筑、VR(虚拟现实)/ AR(增强现实)、医学成像、物理模拟、GUI(图形用户界面)等。
  • 本课程的核心内容(你将学到什么):

    • 光栅化 (Rasterization): 把三维几何物体投影到二维屏幕上,画出像素(实时渲染,多用于游戏)。

    • 几何 (Curves and Meshes): 如何在计算机中表示曲线和三维表面(如贝塞尔曲线、多边形网格)。

    • 光线追踪 (Ray Tracing): 模拟光线的传播路径来生成高度真实的图像(离线渲染,多用于电影;现在也逐渐用于实时渲染)。

    • 动画与模拟 (Animation / Simulation): 让物体动起来,模拟真实的物理现象(如布料、流体)。

  • 图形学与计算机视觉 (Computer Vision) 的区别:

    • 图形学 (Graphics): 模型 $\rightarrow$ 图像(“无中生有”,创造画面)。

    • 计算机视觉 (Vision): 图像 $\rightarrow$ 模型(“看图说话”,理解画面,如人脸识别)。

第二讲:线性代数复习 (Review of Linear Algebra)

图形学的底层是数学,尤其是线性代数。这一讲复习了最常用的数学工具。

1. 向量 (Vectors)

  • 定义: 包含方向 (Direction)和长度 (Magnitude/Length)

  • 单位向量 (Unit Vector): 长度为 1 的向量,常用来单纯表示方向(如 $\hat{a} = \frac{\vec{a}}{\Vert{}\vec{a}\Vert{}}$)。

  • 向量加法: 几何上满足平行四边形法则或三角形法则。

2. 点乘 (Dot Product)

  • 公式: $\vec{a} \cdot \vec{b} = \Vert{}\vec{a}\Vert{}\Vert{}\vec{b}\Vert{}\cos\theta$

  • 在笛卡尔坐标系中,如果是二维向量:$\vec{a} \cdot \vec{b} = x_a x_b + y_a y_b$

  • 在图形学中的核心作用:

    1. 求两个向量的夹角

    2. 求投影 (Projection): 将一个向量投影到另一个向量上。

    3. 判断方向的远近程度:

      • $\vec{a} \cdot \vec{b} > 0$:方向基本相同(夹角 $< 90^\circ$)。

      • $\vec{a} \cdot \vec{b} = 0$:相互垂直。

      • $\vec{a} \cdot \vec{b} < 0$:方向基本相反(夹角 $> 90^\circ$)。

    4. 可以用来计算光照(光源方向与表面法线方向的夹角)。

3. 叉乘 (Cross Product)

  • 定义: 两个向量叉乘的结果是一个新向量,这个新向量垂直于原来两个向量组成的平面。

  • 大小: $\Vert{}\vec{a} \times \vec{b}\Vert{} = \Vert{}\vec{a}\Vert{}\Vert{}\vec{b}\Vert{}\sin\theta$

  • 方向:右手定则决定。

  • 注意: 叉乘不满足交换律,$\vec{a} \times \vec{b} = -\vec{b} \times \vec{a}$。

  • 在图形学中的核心作用(非常重要):

    1. 判断左和右: 比如 $\vec{a} \times \vec{b}$ 的结果在 Z 轴上为正,说明 $\vec{b}$ 在 $\vec{a}$ 的左边(逆时针方向)。

    2. 判断内与外: 判定一个点是否在一个多边形(如三角形)的内部。这是光栅化过程中决定像素是否被点亮的基础。

4. 矩阵 (Matrices)

  • 矩阵乘法: 只有当第一个矩阵的列数等于第二个矩阵的行数时才能相乘。结果矩阵的第 $i$ 行第 $j$ 列的元素,是第一个矩阵的第 $i$ 行与第二个矩阵的第 $j$ 列的点乘。

  • 矩阵乘法不满足交换律:$AB \neq BA$。

  • 矩阵乘法满足结合律:$(AB)C = A(BC)$。

  • 转置 (Transpose): 行列互换。性质:$(AB)^T = B^T A^T$。

  • 逆矩阵 (Inverse): $A A^{-1} = A^{-1} A = I$($I$ 为单位矩阵)。性质:$(AB)^{-1} = B^{-1} A^{-1}$。

第三讲:变换 (Transformation)

1、 为什么图形学要研究“变换”?

在计算机中,所有的物体(比如游戏里的角色、房子、赛车)本质上都是由一堆三维/二维顶点的坐标构成的。

当我们要实现以下效果时:

  1. 物体动起来(平移、旋转)

  2. 镜头变远/变近(缩放、视角改变)

  3. 把三维世界画到二维屏幕上(投影)

我们不可能去手动修改每一个顶点的坐标,而是需要找到一种高效、统一的数学方法,只要给出一个矩阵,乘上所有顶点坐标,就能批量完成位置和形状的改变。

2、 2D 线性变换(Linear Transformations)

假设我们在二维平面上有个点 $(x, y)$,变换后变成了 $(x’, y’)$。如果变换过程能写成下面的形式:

$$x’ = ax + by$$

$$y’ = cx + dy$$

用矩阵写出来就是:

$$\begin{pmatrix} x’ \cr y’ \end{pmatrix} = \begin{pmatrix} a & b \cr c & d \end{pmatrix} \begin{pmatrix} x \cr y \end{pmatrix}$$

这种可以用 $2 \times 2$ 矩阵相乘表示的变换,就叫做线性变换。它有两个非常好的几何性质:原点变换后依然是原点,且直线变换后依然是直线

常见的 2D 线性变换有以下几种:

1. 缩放 (Scale)

横向放大 $s_x$ 倍,纵向放大 $s_y$ 倍:

  • $x’ = s_x \cdot x$

  • $y’ = s_y \cdot y$

  • 矩阵表示:

    $$S(s_x, s_y) = \begin{pmatrix} s_x & 0 \cr 0 & s_y \end{pmatrix}$$

2. 切变 (Shear)

想象把一本厚书从侧面推斜:水平方向偏移量与垂直坐标 $y$ 成正比。

  • $x’ = x + a \cdot y$

  • $y’ = y$

  • 矩阵表示:

    $$A = \begin{pmatrix} 1 & a \cr 0 & 1 \end{pmatrix}$$

3. 旋转 (Rotation)

默认绕原点 $(0,0)$ 逆时针旋转 $\theta$ 角度

推导方法很简单:看基向量 $(1,0)$ 和 $(0,1)$ 旋转后去了哪里。

  • $(1,0) \to (\cos\theta, \sin\theta)$

  • $(0,1) \to (-\sin\theta, \cos\theta)$

  • 组合起来得到旋转矩阵:

    $$R_\theta = \begin{pmatrix} \cos\theta & -\sin\theta \cr \sin\theta & \cos\theta \end{pmatrix}$$

重要性质: 旋转矩阵是正交矩阵(Orthogonal Matrix)。正交矩阵的逆矩阵等于其转置矩阵($R_\theta^{-1} = R_\theta^T$)。这意味着想做“反向旋转”,直接把矩阵行列转置即可!

3、 齐次坐标(Homogeneous Coordinates)

1. 为什么“平移”破坏了线性变换?

平移(Translation)的公式是:

$$x’ = x + t_x$$

$$y’ = y + t_y$$

请注意:你没办法找到任何一个 $2 \times 2$ 的矩阵 $\begin{pmatrix} a & b \cr c & d \end{pmatrix}$,使得乘以 $\begin{pmatrix} x \cr y \end{pmatrix}$ 后能算出 $+t_x$ 和 $+t_y$!

因为平移操作把原点 $(0,0)$ 移到了 $(t_x, t_y)$,打破了线性变换“原点不变”的铁律。这种带平移的变换叫做仿射变换(Affine Transformation)

$$\mathbf{x}’ = A\mathbf{x} + \mathbf{b}$$

如果缩放、旋转用矩阵乘法,平移却要额外做加法,计算机处理起来会非常麻烦(无法连续叠加矩阵)。

2. 齐次坐标的巧妙引入

为了把“加法”也统一写成“矩阵乘法”,图形学引入了齐次坐标:增加一个维度 $w$!

在 2D 空间中:

  • 二维点 (Point): 表示为 $(x, y, 1)^T$

  • 二维向量 (Vector): 表示为 $(x, y, 0)^T$

为什么向量的 $w=0$?

  1. 几何意义: 向量只有方向和长度,平移不改变向量。当平移矩阵乘以 $w=0$ 的向量时,平移量会被 $0$ 抹去,保持向量不变。

  2. 代数运算一致性:

    • $\text{点} - \text{点} = \text{向量}$ $\to (x_1, y_1, 1) - (x_2, y_2, 1) = (x_1-x_2, y_1-y_2, 0)$ (满足!)

    • $\text{点} + \text{向量} = \text{点}$ $\to (x, y, 1) + (v_x, v_y, 0) = (x+v_x, y+v_y, 1)$ (满足!)

    • $\text{点} + \text{点} = \text{两点中点}$ $\to (x_1, y_1, 1) + (x_2, y_2, 1) = (x_1+x_2, y_1+y_2, 2)$,在齐次坐标下除以 $w=2$ 还原为 $((x_1+x_2)/2, (y_1+y_2)/2, 1)$。

3. 统一后的 3x3 仿射变换矩阵

有了齐次坐标,平移也可以写成矩阵乘法了:

$$\begin{pmatrix} x’ \cr y’ \cr 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & t_x \cr 0 & 1 & t_y \cr 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \cr y \cr 1 \end{pmatrix}$$

缩放、旋转等也顺势扩展为 $3 \times 3$ 矩阵:

  • 缩放: $\begin{pmatrix} s_x & 0 & 0 \cr 0 & s_y & 0 \cr 0 & 0 & 1 \end{pmatrix}$

  • 旋转: $\begin{pmatrix} \cos\theta & -\sin\theta & 0 \cr \sin\theta & \cos\theta & 0 \cr 0 & 0 & 1 \end{pmatrix}$

4、 变换的组合与矩阵顺序

假设我们要对一个图形先做变换 $A$,再做变换 $B$,最后做变换 $C$:

$$\mathbf{p}’ = C \cdot (B \cdot (A \cdot \mathbf{p})) = (C \cdot B \cdot A) \mathbf{p}$$

1. 矩阵乘法不可交换!

$A \cdot B \neq B \cdot A$。变换的顺序至关重要!

  • 先旋转再平移 $\neq$ 先平移再旋转

    • 先旋转再平移:物体在原点旋转,然后平移到指定位置。

    • 先平移再旋转:物体先移走,然后再绕世界原点旋转,会导致物体绕着远方的原点画圆弧!

2. 如何绕“任意指定点 $C$”进行旋转?

默认的旋转矩阵只能绕原点 $(0,0)$ 旋转。如果你想绕图形自己的中心点 $C(x_c, y_c)$ 旋转,步骤如下:

  1. 平移: 把中心点 $C$ 平移到原点 $\to T(-x_c, -y_c)$

  2. 旋转: 绕原点旋转 $\theta$ 角 $\to R(\theta)$

  3. 平移回来: 把原点平移回 $C$ $\to T(x_c, y_c)$

整体变换矩阵为:

$$M = T(x_c, y_c) \cdot R(\theta) \cdot T(-x_c, -y_c)$$