几何(曲线与曲面)
上一章把几何表示分成点云、线框、三角网格、隐式表面、参数表示和体数据。三角网格适合实时渲染,但它毕竟是离散的:一个圆用很多线段近似,一个曲面用很多三角形近似。
本章关注另一类几何:曲线与曲面。它们通常用少量控制点和数学函数描述连续形状,然后在需要渲染、碰撞或制造时再离散成线段或三角网格。
这种思想在图形学中非常重要。字体轮廓、动画路径、相机轨迹、角色建模、汽车外壳、工业 CAD、曲面细分,都离不开曲线与曲面。
最直接的曲线描述方式是参数方程。二维或三维曲线可以写成:
其中 是参数,通常位于某个区间内,例如 。当 从 变化到 时,点 在空间中移动,轨迹就形成一条曲线。
例如二维圆可以写成:
参数曲线的优点是连续、紧凑、容易求导。导数可以表示曲线在某一点的切线方向:
这对动画路径、相机运动、曲面法线和物体沿曲线移动都很有用。
为什么需要控制点
Section titled “为什么需要控制点”直接写出 、、 的函数在数学上很清楚,但对建模和设计并不友好。艺术家或设计师更希望通过拖动少量点来控制形状,而不是手写复杂方程。
于是就有了控制点 (Control Points) 的思想:曲线不一定穿过所有控制点,但控制点会像磁铁一样影响曲线走向。
控制点带来几个好处:
- 形状可视化编辑。
- 曲线可以局部或整体调整。
- 曲线能保持平滑。
- 可以用统一算法生成许多不同形状。
Bezier 曲线就是最经典的控制点曲线之一。
Bezier 曲线的基本形式
Section titled “Bezier 曲线的基本形式”一条 次 Bezier 曲线由 个控制点决定:
曲线可以写成 Bernstein 多项式形式:
其中 。
二次 Bezier 曲线有三个控制点:
三次 Bezier 曲线有四个控制点:
三次 Bezier 非常常见,因为它既足够简单,又能表达丰富形状。SVG 路径、字体轮廓、矢量绘图工具和许多动画曲线都大量使用三次 Bezier。
de Casteljau 算法
Section titled “de Casteljau 算法”Bezier 曲线还有一种非常直观的构造方式:反复线性插值。这就是 de Casteljau 算法。
以三次 Bezier 为例,先在相邻控制点之间插值:
再继续插值:
最后:
这个过程只用了线性插值,却生成了平滑曲线。它不仅数值稳定,而且几何意义非常清楚:Bezier 曲线可以看作控制多边形不断“收缩插值”后留下的轨迹。
拖动控制点时,可以观察两个现象:曲线端点固定在 和最后一个控制点上;中间控制点通常不在曲线上,但会影响曲线进入和离开端点的方向。
Bezier 曲线的重要性质
Section titled “Bezier 曲线的重要性质”Bezier 曲线有几个非常实用的性质。
首先,它会经过首尾控制点:
其次,曲线被控制多边形的凸包包围。也就是说,曲线不会跑到控制点围成的整体范围之外太远。这让编辑曲线时更可预测。
第三,端点切线由相邻控制点决定。对于三次 Bezier:
这解释了为什么矢量绘图工具中,拖动端点旁边的控制柄可以改变曲线进入或离开端点的方向。
分段曲线与连续性
Section titled “分段曲线与连续性”单条高次 Bezier 曲线可以表达复杂形状,但高次曲线不容易控制。实际应用中更常见的是把多段低次曲线拼接起来,例如多段三次 Bezier。
拼接时需要关心连续性 (Continuity):
- 连续:两段曲线端点相接,位置连续。
- 连续:端点相接,并且一阶导数方向和大小连续,速度也连续。
- 连续:切线方向连续,但导数大小可以不同,视觉上仍然比较平滑。
- 连续:二阶导数也连续,曲率变化更平滑。
字体轮廓和图标绘制通常至少需要视觉上的切线连续;相机轨迹和机械运动则常常需要更高阶连续性,否则会出现速度或加速度突变。
B 样条与 NURBS 的直觉
Section titled “B 样条与 NURBS 的直觉”Bezier 曲线的一个局限是控制点影响范围较大。移动一个控制点可能影响整段曲线。对于复杂模型,设计者更希望“局部修改只影响附近区域”。
B 样条 (B-Spline) 通过分段基函数解决这个问题。它仍然由控制点控制,但每个控制点只影响曲线的一部分区域,因此更适合复杂曲线和曲面建模。
NURBS (Non-Uniform Rational B-Splines) 在 B 样条基础上加入权重和有理表达,能够精确表示圆、椭圆等二次曲线,因此在 CAD、工业设计和精密建模中非常重要。
本章不展开 NURBS 的完整公式,只需要先记住:
- Bezier 简洁直观,适合讲解和局部曲线段。
- B 样条更适合长曲线和局部编辑。
- NURBS 更适合精确工业曲面。
曲线由一个参数 控制,曲面通常由两个参数 、 控制:
其中 可以理解为曲面上的二维坐标。上一章中 UV 用来访问纹理;在参数曲面中, 和 可以直接生成曲面上的空间位置。
例如一个简单平面可以写成:
而更复杂的 Bezier 曲面可以使用二维控制点网格生成:
这里 是控制点网格,、 是基函数。直观上,曲面就像一张被控制点拉动的弹性薄膜。
曲面的切线与法线
Section titled “曲面的切线与法线”参数曲面不仅能给出位置,还能给出切线方向。对曲面 分别求偏导:
这两个方向分别表示曲面沿 和 方向的变化。曲面法线可以由它们叉乘得到:
这和前面学习的法线、切线空间、TBN 矩阵联系起来了:曲面参数方向可以提供自然的切线和副切线,进而帮助计算法线和纹理映射。
从连续曲面到三角网格
Section titled “从连续曲面到三角网格”无论曲线和曲面在数学上多么连续,要进入传统实时渲染管线,通常仍要离散化。
曲线会被采样成线段:
曲面会被采样成顶点网格,再拆成三角形:
(u0, v0) -> P00(u1, v0) -> P10(u0, v1) -> P01(u1, v1) -> P11
quad(P00, P10, P11, P01) -> two triangles采样密度越高,曲线或曲面越接近真实连续形状,但顶点和三角形数量也越多。实际系统会在质量和性能之间做取舍,有时还会使用自适应细分:弯曲剧烈或靠近相机的地方采样更密,平坦或远处的地方采样更稀。
- 确定参数范围:例如 。
- 按分辨率采样参数点:生成一组规则或自适应的 。
- 计算空间顶点:把每个参数点代入 。
- 计算属性:根据偏导或邻域估计法线、切线和 UV。
- 生成三角形索引:把采样网格连接成可渲染三角形。
- 送入渲染管线:像普通三角网格一样执行变换、光栅化和着色。
细分曲面的基本直觉
Section titled “细分曲面的基本直觉”细分曲面 (Subdivision Surface) 从一个粗糙控制网格出发,通过反复细分和调整顶点位置生成更光滑的表面。
直观地说:
- 控制网格决定整体形状。
- 每次细分会产生更多顶点和面。
- 顶点位置根据邻域规则被重新计算。
- 多次细分后,表面趋向平滑。
这类方法很适合角色、动画和有机形状建模。建模时可以保留较简单的控制网格,渲染时再生成更高细节的表面。它和 Bezier / B 样条一样,体现了一个共同思想:用少量控制结构描述更平滑、更复杂的连续形状。
曲线曲面的常见应用
Section titled “曲线曲面的常见应用”曲线与曲面在图形系统中随处可见:
| 应用 | 常见表示 |
|---|---|
| 字体轮廓 | 二次或三次 Bezier |
| SVG 图形 | Bezier 路径 |
| 动画缓动 | 一维 Bezier 曲线 |
| 相机轨迹 | 样条曲线 |
| 道路和轨道 | 分段样条 |
| 工业产品外壳 | NURBS 曲面 |
| 角色有机表面 | 细分曲面 |
| 实时渲染输出 | 离散三角网格 |
这些应用看起来不同,但都围绕一个核心问题:如何用可编辑、可计算、可控的方式描述连续形状。
本章介绍了曲线与曲面的基础思想。请重点记住以下结论:
- 参数曲线用 描述点随参数变化的轨迹;参数曲面用 描述二维参数域到三维空间的映射。
- Bezier 曲线由控制点决定,常用 Bernstein 多项式或 de Casteljau 线性插值算法计算。
- Bezier 曲线经过首尾控制点,中间控制点主要影响切线方向和弯曲趋势。
- 分段曲线需要关注连续性,位置连续不等于视觉平滑,切线和曲率连续会带来更自然的连接。
- B 样条和 NURBS 更适合复杂曲线曲面与局部编辑;细分曲面则通过反复细分控制网格生成平滑表面。
- 连续曲线和曲面进入实时渲染前通常要离散成线段或三角网格,再交给光栅化管线处理。
下一章会回到网格本身,讨论网格处理的基本问题,并引入阴影图如何利用深度信息判断光源可见性。