计算机图形学(Computer Graphics)入门笔记, 主要参考 Games 101Fundamentals of Computer Graphics(Tiger Book 虎书)

CG Notes 系列
  1. 基础

基础数学 Math Misc

  • Tiger Book Chapter 2: Miscellaneous Math
  • Games 101 Lecture 2: Review of Linear Algebra

基本线性代数

Vector Operations

Dot Product 点积
  • \(\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos \phi\)
  • 笛卡尔坐标系下的计算:\(\mathbf{a} \cdot \mathbf{b} = x_a x_b + y_a y_b + z_a z_b\)
  • 几何理解:点积的结果是 \(\mathbf{a}\)\(\mathbf{b}\) 的模长乘以它们夹角的余弦值,表示两个向量在同一方向上的投影长度。
  • 余弦相似度:\(\cos \phi = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}\),经常用于衡量两个向量的相似度:机器学习等。
Cross Product 叉积
  • \(\mathbf{a} \times \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \sin \phi\)
  • 几何理解:叉积的结果是垂直于 \(\mathbf{a}\)\(\mathbf{b}\) 的向量,方向由右手定则确定,模为向量 \(\mathbf{a}\)\(\mathbf{b}\) 所张平行四边形的面积。
  • 右手坐标系:在笛卡尔系的基础上定义:\(\mathbf{x} = (1, 0, 0)\), \(\mathbf{y} = (0, 1, 0)\), \(\mathbf{z} = (0, 0, 1)\),则有
    • \(\mathbf{x} \times \mathbf{y} = \mathbf{z}\)
    • \(\mathbf{y} \times \mathbf{z} = \mathbf{x}\)
    • \(\mathbf{z} \times \mathbf{x} = \mathbf{y}\)
  • 笛卡尔坐标系下的计算:\(\mathbf{a} \times \mathbf{b} = (y_a z_b - z_a y_b, z_a x_b - x_a z_b, x_a y_b - y_a x_b)\)

Matrix Operations

解析几何

Tiger Book 第二章可以说是对高中生都非常友好的入门材料。这章内容涵盖了集合与函数、笛卡尔坐标系、三角函数、曲线的隐函数和参数方程等,基本上是高中数学几何部分的全部。在此之上需要记录的是展开到三维空间的内容。

Curves and Surfaces

Implicit Curves 隐函数曲线:

形如 \(f(x, y) = 0\) 的曲线表示方法。\((x, y)\) 作为二维向量 \(\mathbf{p}\),则隐函数可以表示为 \(f(\mathbf{p}) = 0\)

  • 例如圆的隐函数方程:\(f(x, y) = x^2 + y^2 - r^2 = 0\), 或者 \(f(\mathbf{p}) = \|\mathbf{p}\|^2 - r^2 = 0\)
  • 隐函数 \(f(x, y)\) 是一种势函数 \(c = f(x, y)\) 的等值线。这里 \(x\)\(y\) 都是自变量,因此 \(f\) 的梯度 $ \nabla f = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})$ 是势函数 \(c\) 的切向量,同时是等值面 \(f(x, y) = 0\) 的法向量。对于三维曲面同理:\(\mathbf{n} = \nabla f(\mathbf{p}) = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z})\)
  • 二维直线 \(f(x, y) = Ax + By + C = 0\)
    • 法向量 \(\mathbf{n} = (A, B)\)
    • 对于任意点 \(\mathbf{p} = (a, b)\)\(\mathbf{p}\) 到直线的符号距离为 \(d = \frac{f(a, b)}{\|\mathbf{n}\|} = \frac{f(a, b)}{\sqrt{A^2 + B^2}}\),正负表示点在直线的两侧。同时,显然,对任意 \((x, y)\)\(f(x, y) = c\) 的值与点到 \(f(x, y) = 0\) 的符号距离成正比。
  • 三维平面:
    • 任意点 \(\mathbf{p} = (x, y, z)\) 和平面上的三点 \(\mathbf{a}, \mathbf{b}, \mathbf{c}\)
    • \(\mathbf{p}\) 在平面上,则平面方程:\(f(\mathbf{p}) = (\mathbf{p} - \mathbf{a}) \cdot \mathbf{n} = (\mathbf{p} - \mathbf{a}) \cdot ((\mathbf{b} - \mathbf{a}) \times (\mathbf{c} - \mathbf{a})) = 0\)。展开式为: \[\begin{vmatrix} x - x_a & y - y_a & z - z_a \\\\ x_b - x_a & y_b - y_a & z_b - z_a \\\\ x_c - x_a & y_c - y_a & z_c - z_a \end{vmatrix} = 0\]
    • 对任意点 \(\mathbf{p}\)\((\mathbf{p} - \mathbf{a}) \cdot ((\mathbf{b} - \mathbf{a}) \times (\mathbf{c} - \mathbf{a}))\) 的值为由 \(\mathbf{p}-\mathbf{a}\)\(\mathbf{b}-\mathbf{a}\)\(\mathbf{c}-\mathbf{a}\) 张成的平行六面体的体积。
    • 符号距离对三维平面显然还成立。

三维直线没有单个隐函数方程的形式,但两个平面确定一条直线,可用两个平面的隐函数方程描述。

Parametric Curves 参数曲线(方程): 对于三维曲面,参数方程 \([x, y, z] = \mathbf{p}(u, v)\),其中 \(u\)\(v\) 是参数。

  • 法向量 \(\mathbf{n} = \frac{\partial \mathbf{p}}{\partial u} \times \frac{\partial \mathbf{p}}{\partial v}\)

隐函数和参数方程的导数几何含义:前者是隐函数曲线/面的法向量,后者是参数曲线/面的切向量。

Triangles

  1. Area of Triangle 顶点 \(\mathbf{a}, \mathbf{b}, \mathbf{c}\)

    • 通过叉积计算面积:
      • 二维 \[\text{Area} = \frac{1}{2} \left| \begin{vmatrix} x_b - x_a & y_b - y_a \\\\ x_c - x_a & y_c - y_a \end{vmatrix} \right|\]
      • 三维 \[\text{Area} = \frac{1}{2} \left\|| (\mathbf{b} - \mathbf{a}) \times (\mathbf{c} - \mathbf{a}) \right\||\]
  2. Barycentric Coordinates 重心坐标

    • 对于三角形 \(\triangle ABC\),任意点 \(\mathbf{p}\) 可以用重心坐标 \(\alpha, \beta, \gamma\) 表示:

    \[\mathbf{p} = \alpha \mathbf{a} + \beta \mathbf{b} + \gamma \mathbf{c}\]

    \[\alpha + \beta + \gamma = 1\]

    • 有什么用?将属性值(如颜色、纹理坐标等)从顶点插值到三角形内部的任意点。
    • \(\mathbf{p}\)\(\triangle ABC\) 内部当且仅当 \(\alpha, \beta, \gamma > 0\)\(\mathbf{p}\)\(\triangle ABC\) 顶点时,\(\alpha, \beta, \gamma\) 中有一个为 1,其余为 0;\(\mathbf{p}\)\(\triangle ABC\) 边界上时,两个坐标为正,一个为 0。
    • 重心坐标可以通过面积比(2D 隐式直线的距离正比性质)计算,\(\alpha, \beta, \gamma\) 的几何意义是 \(\mathbf{p}\) 到三角形各顶点的面积比: \[\alpha = \frac{\text{Area}(\triangle PBC)}{\text{Area}(\triangle ABC)}, \quad \beta = \frac{\text{Area}(\triangle APC)}{\text{Area}(\triangle ABC)}, \quad \gamma = \frac{\text{Area}(\triangle ABP)}{\text{Area}(\triangle ABC)}\]
    • 对于三维三角形 \(\triangle ABC\),重心坐标用法向量计算三角形面积比(计算时注意方向)。 \[\alpha = \frac{\mathbf{n} \cdot \mathbf{n_a}}{||\mathbf{n}||^2}, \quad \beta = \frac{\mathbf{n} \cdot \mathbf{n_b}}{||\mathbf{n}||^2}, \quad \gamma = \frac{\mathbf{n} \cdot \mathbf{n_c}}{||\mathbf{n}||^2}\] 其中 \(\mathbf{n} = (\mathbf{b} - \mathbf{a}) \times (\mathbf{c} - \mathbf{a})\) 是三角形的法向量,\[\mathbf{n_a} = (\mathbf{c} - \mathbf{b}) \times (\mathbf{p} - \mathbf{b}), \quad \mathbf{n_b} = (\mathbf{a} - \mathbf{c}) \times (\mathbf{p} - \mathbf{c}), \quad \mathbf{n_c} = (\mathbf{b} - \mathbf{a}) \times (\mathbf{p} - \mathbf{a})\]