← Back to blog

GAMES101 — Modern Computer Graphics Note3: Geometry

对应 Lecture 10–12 的几何部分。Lecture 10 开头的纹理应用和 Lecture 12 末尾的 shadow mapping 放在了上一篇。

1. 几何的表示

几何在图形学里无处不在:汽车、布料、水滴、树叶、城市、毛发、病毒结构……表示方法 分两大类:

每种表示适合不同的任务和几何类型。

Ways to represent geometry
Ways to represent geometry

1.1 隐式表示

基于对点的分类:点满足某个关系式,比如球面是所有满足 \(x^2 + y^2 + z^2 = 1\) 的点。 一般地写成 \(f(x, y, z) = 0\),\(f < 0\) 在内部,\(f > 0\) 在外部。

Implicit representation
Implicit representation
Inside/outside test is easy
Inside/outside test is easy

1.2 显式表示

所有点直接给出或通过参数映射给出:\(f: \mathbb{R}^2 \to \mathbb{R}^3\), \((u, v) \mapsto (x, y, z)\)。

Explicit sampling is easy
Explicit sampling is easy

没有"最好"的表示,取决于任务。Pixar 的 David Baraff:"I hate meshes. I cannot believe how hard this is. Geometry is hard."

1.3 更多隐式表示

Constructive solid geometry Blending distance functions Level set

隐式表示的优缺点:

Implicit pros and cons
Implicit pros and cons

1.4 更多显式表示

Point cloud Polygon mesh The .obj format

2. 曲线:Bézier curves

曲线的应用:相机路径、动画曲线(关键帧插值)、矢量字体(Baskerville 就是分段三次 Bézier 曲线)。

2.1 定义

Bézier 曲线由一组控制点定义。三次 Bézier 用 4 个点 \(p_0, p_1, p_2, p_3\):曲线 从 \(p_0\) 出发、在 \(p_3\) 结束,起点切线 \(t_0 = 3(p_1 - p_0)\),终点切线 \(t_1 = 3(p_3 - p_2)\)。

Cubic Bézier with tangents
Cubic Bézier with tangents

2.2 De Casteljau 算法

怎么求曲线上的点?以二次(3 个点 \(b_0, b_1, b_2\))为例,给定 \(t \in [0, 1]\):

  1. 在 \(b_0 b_1\) 上按 \(t\) 线性插值得到 \(b_0^1\),在 \(b_1 b_2\) 上得到 \(b_1^1\)
  2. 在 \(b_0^1 b_1^1\) 上再按 \(t\) 插值得到 \(b_0^2\),这就是曲线上 \(t\) 对应的点
  3. 对 \([0, 1]\) 里每个 \(t\) 重复,连起来就是曲线

三次的情况一样,4 个点递归做三层线性插值。

De Casteljau for cubic Bézier
De Casteljau for cubic Bézier

2.3 代数形式

De Casteljau 给出一个系数金字塔:每个向右的箭头乘 \(t\),向左的乘 \((1 - t)\)。

De Casteljau pyramid
De Casteljau pyramid

二次的例子:

\[b_0^1(t) = (1 - t) b_0 + t b_1, \quad b_1^1(t) = (1 - t) b_1 + t b_2$$ $$b_0^2(t) = (1 - t) b_0^1 + t b_1^1 = (1 - t)^2 b_0 + 2t(1 - t) b_1 + t^2 b_2\]

一般地,\(n\) 阶 Bézier 曲线的 Bernstein 形式:

\[\mathbf{b}^n(t) = \mathbf{b}_0^n(t) = \sum_{j = 0}^n \mathbf{b}_j B_j^n(t), \qquad B_i^n(t) = \binom{n}{i} t^i (1 - t)^{n - i}\]

\(\mathbf{b}_j\) 是控制点(\(\mathbb{R}^N\) 里的向量),\(B_i^n\) 是 Bernstein 多项式 (标量,\(n\) 次),本质上是二项分布。三次的例子:

\[\mathbf{b}^3(t) = \mathbf{b}_0 (1 - t)^3 + \mathbf{b}_1 \, 3t(1 - t)^2 + \mathbf{b}_2 \, 3t^2(1 - t) + \mathbf{b}_3 \, t^3\]

控制点可以在 3D,得到 3D 曲线。

Bernstein form Cubic Bernstein basis functions

2.4 性质

Properties of Bézier curves
Properties of Bézier curves

2.5 分段 Bézier 曲线

高阶 Bézier 曲线很难控制,不常用。取而代之是把很多低阶曲线串起来, 分段三次 Bézier 是最常见的技术(字体、路径、Illustrator、Keynote……)。 每 4 个控制点一段,所以工具里拖动的是"锚点 + 两个手柄"。

连续性:两段曲线 \(\mathbf{a}\)(\([k, k + 1]\))和 \(\mathbf{b}\)(\([k + 1, k + 2]\))

C1 continuity
C1 continuity

2.6 其他样条

Spline:通过给定点、且有若干阶连续导数的连续曲线,简言之"受控的曲线"。 B-splines(basis splines)需要比 Bézier 更多的信息,满足 Bézier 的所有重要性质 (是它的超集),并且有局部性:动一个控制点只影响局部。本课不讲 B-spline、 NURBS 以及曲线上的操作(升降阶等),可参考胡事民老师的课程。

3. 曲面:Bézier surfaces

把 Bézier 曲线扩展到曲面。Bicubic Bézier surface patch 由 \(4 \times 4\) 个控制点 定义,输出是由 \((u, v) \in [0, 1]^2\) 参数化的 2D 曲面。Utah teapot 就是由多个 patch 拼成的。

Bicubic Bézier patch
Bicubic Bézier patch

求值:可分离的 1D de Casteljau。 目标是求 \((u, v)\) 对应的曲面点:

  1. 对 4 条 \(u\) 方向的 Bézier 曲线各用 de Casteljau 求出 \(u\) 处的点,得到 4 个 "移动的" Bézier 曲线的控制点
  2. 对这条移动曲线用 1D de Casteljau 求 \(v\) 处的点
Separable de Casteljau
Separable de Casteljau

4. Mesh 处理

三种 geometry processing 操作:

Mesh operations
Mesh operations

4.1 Loop subdivision

三角形网格的常用细分规则(Loop 是人名,不是循环)。两步:先增加三角形(顶点), 再调整位置。

  1. 每个三角形沿三边中点拆成四个
  2. 按权重给顶点赋新位置,新顶点和老顶点更新方式不同

新顶点(边中点):设该边两个端点是 \(A, B\),两侧三角形的另外两个顶点是 \(C, D\),

\[\frac{3}{8}(A + B) + \frac{1}{8}(C + D)\]
Loop subdivision: new vertices
Loop subdivision: new vertices

老顶点:设顶点度数为 \(n\),\(u = 3/16\)(\(n = 3\) 时)或 \(u = 3 / (8n)\)(否则),

\[(1 - n u) \cdot \text{original\_position} + u \cdot \text{neighbor\_position\_sum}\]

意思是:老顶点相信自己一部分,也相信邻居一部分;度数越高,邻居的话语权越大。

Loop subdivision: old vertices
Loop subdivision: old vertices

4.2 Catmull-Clark subdivision

Loop 只适用于三角形网格。Catmull-Clark 适用于一般网格(含四边形和非四边形面)。 先定义:非四边形面(non-quad face)和奇异点(extraordinary vertex,度数 ≠ 4)。

每一步细分:

  1. 在每个面里加一个点
  2. 在每条边上加中点
  3. 把所有新点连起来
Catmull-Clark subdivision
Catmull-Clark subdivision

一次细分之后:每个非四边形面都变成一个奇异点(度数等于原面的边数),奇异点的 数量增加了原来非四边形面的数量;之后所有面都是四边形,奇异点的数量不再增加。

更新规则(四边形网格):

Catmull-Clark rules
Catmull-Clark rules

细分多次后收敛到光滑曲面,需要保留的锐边(creases)可以特殊处理。Pixar 的 "Geri's Game" 是细分曲面的经典应用。

4.3 Mesh simplification

目标:减少网格元素数量,同时保持整体形状(比如 30000 个三角形减到 300 个)。 基本操作是 edge collapsing:把一条边的两个端点合并成一个。

Edge collapse
Edge collapse

合并到哪里?简单地取顶点平均不好。Quadric error metrics:新顶点应该最小化 到之前相关三角形所在平面的距离平方和(\(L_2\) 距离)。

Quadric error metrics
Quadric error metrics

算法(Garland & Heckbert 1997):

  1. 给每条边打分:坍缩它并把新点放在 quadric error 最小的位置,这个最小误差就是分数
  2. 迭代地坍缩分数最小的边
  3. 坍缩后受影响的边要重新打分,所以用优先队列(堆)维护

这是贪心算法,但效果很好。

Simplification via quadric error
Simplification via quadric error

5. 课程路线图

到这里覆盖了 rasterization 和 geometry 两大块,接下来是 ray tracing 和 animation / simulation。

X / Twitter Facebook LinkedIn 微博

You may also like

Comments