GAMES101 01-03
第一讲:计算机图形学概述 (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$
在图形学中的核心作用:
求两个向量的夹角。
求投影 (Projection): 将一个向量投影到另一个向量上。
判断方向的远近程度:
$\vec{a} \cdot \vec{b} > 0$:方向基本相同(夹角 $< 90^\circ$)。
$\vec{a} \cdot \vec{b} = 0$:相互垂直。
$\vec{a} \cdot \vec{b} < 0$:方向基本相反(夹角 $> 90^\circ$)。
可以用来计算光照(光源方向与表面法线方向的夹角)。
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}$。
在图形学中的核心作用(非常重要):
判断左和右: 比如 $\vec{a} \times \vec{b}$ 的结果在 Z 轴上为正,说明 $\vec{b}$ 在 $\vec{a}$ 的左边(逆时针方向)。
判断内与外: 判定一个点是否在一个多边形(如三角形)的内部。这是光栅化过程中决定像素是否被点亮的基础。
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、 为什么图形学要研究“变换”?
在计算机中,所有的物体(比如游戏里的角色、房子、赛车)本质上都是由一堆三维/二维顶点的坐标构成的。
当我们要实现以下效果时:
物体动起来(平移、旋转)
镜头变远/变近(缩放、视角改变)
把三维世界画到二维屏幕上(投影)
我们不可能去手动修改每一个顶点的坐标,而是需要找到一种高效、统一的数学方法,只要给出一个矩阵,乘上所有顶点坐标,就能批量完成位置和形状的改变。
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$?
几何意义: 向量只有方向和长度,平移不改变向量。当平移矩阵乘以 $w=0$ 的向量时,平移量会被 $0$ 抹去,保持向量不变。
代数运算一致性:
$\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)$ 旋转,步骤如下:
平移: 把中心点 $C$ 平移到原点 $\to T(-x_c, -y_c)$
旋转: 绕原点旋转 $\theta$ 角 $\to R(\theta)$
平移回来: 把原点平移回 $C$ $\to T(x_c, y_c)$
整体变换矩阵为:
$$M = T(x_c, y_c) \cdot R(\theta) \cdot T(-x_c, -y_c)$$





