细分从一个控制多边形 / 控制网格出发,反复"细化 + 平滑",极限是光滑的曲线或曲面。它能从任意拓扑的网格得到连续、无裂缝的曲面,规则简单、天然支持无限 LOD,连接了离散三角网格与连续曲面。游戏和电影最常用的是 Catmull-Clark(四边形)和 Loop(三角形)两种逼近型方案,可扩展出折痕和置换细分。
细分曲线(17.4 节)
- Chaikin 切角(逼近型):每对相邻顶点之间生成两个新点,丢弃旧点:
p2ik+1=43pik+41pi+1k,p2i+1k+1=41pik+43pi+1k
极限曲线 P∞ 是二次 B 样条;可看成去掉尖角(高频)的低通滤波。开放折线保留两个端点即可让曲线经过端点。
- 4 点方案(插值型,保留上一层所有点):
p2ik+1=pik,p2i+1k+1=(21+w)(pik+pi+1k)−w(pi−1k+pi+2k)
w 为张力,w=0 即线性插值,0<w<1/8 时 C1,常用 1/16。开放折线端点处把相邻点关于端点反射:p−1=2p0−p1。
- 另一种逼近方案 p2ik+1=43pik+81(pi−1k+pi+1k)、新点取中点,生成三次 B 样条。
- 可以直接把点或切线"推"到极限曲线上。
细分曲面的框架(17.5 节)
每一步分两个阶段:细化(生成新顶点并重新连接成更小的面)和平滑(计算部分或全部顶点的新位置)。方案按以下特征分类:逼近 / 插值、静态(每步规则相同)/ 非静态、均匀 / 非均匀(边界边常用不同规则)、基于三角形 / 基于多边形。
flowchart LR
M["控制网格"] --> R["细化: 插入边点/面点, 重连"]
R --> S["平滑: 按掩码加权更新位置"]
S --> R
S --> L["极限曲面: 也可用闭式直接求极限点和切线"]
如上图,细化与平滑交替进行;掩码 (mask / stencil) 用一张图就能表达整个方案,且权重总和为 1,保证新点位于被加权点的邻域内。
Loop 细分(17.5.1 节)
第一个三角形细分方案,逼近型,每个三角形分成 4 个,n 步后为 4n 个。顶点度为 6 称为规则,否则为非规则 (extraordinary)。对度为 n 的顶点 pk 及其 1 环邻点 pik:
pk+1=(1−nβ)pk+β(p0k+⋯+pn−1k),pik+1=83pk+3pik+pi−1k+pi+1k
β(n)=n1(85−64(3+2cos(2π/n))2)
规则顶点处 C2,非规则顶点处 C1;细分只产生规则顶点,所以只有控制网格中原本的非规则顶点处是 C1。Warren 与 Weimer 的无三角函数变体 β(n)=n(n+2)3 效果几乎无法区分。
- 极限位置:把上面第一式中的 β(n) 换成 γ(n)=n+8β(n)31。
- 极限切线:tu=∑icos(2πi/n)pik,tv=∑isin(2πi/n)pik,法线 tu×tv,通常比平均邻面法线更便宜且是精确法线。
- 非封闭网格需要边界规则(可用上面三次 B 样条曲线规则)。
- 逼近型的优缺点:曲面更"光顺"(fair)、收敛更快;但会收缩,小而凸的网格(如四面体)最明显,需在控制网格中多放顶点;Loop 曲面位于原控制点凸包内。全规则网格时 Loop 曲面是三方向四次箱样条。
Catmull-Clark 细分(17.5.2 节)
能处理任意多边形的最著名方案(另一个是 Doo-Sabin),用于皮克斯《Geri's Game》《玩具总动员 2》及之后所有长片,也是游戏建模最常用的方案。它生成更对称的曲面(长方盒得到对称的类椭球体,而三角形方案结果取决于正方形怎么切)。第一步后只生成四边形,规则顶点度为 4。
- 每个面生成面点 fk+1(面质心);对度为 n 的顶点 vk 及周围边点 ejk:
vk+1=nn−2vk+n21∑j=0n−1ejk+n21∑j=0n−1fjk+1,ejk+1=4vk+ejk+fj−1k+1+fjk+1
- 全规则时等价于双三次 B 样条曲面(见 参数曲面与贝塞尔面片),能处理非规则配置正是其优势;极限位置与切线有显式公式。GPU 渲染见 高效曲面细分。
分段光滑细分:折痕(17.5.3 节)
Hoppe 等为 Loop 曲面引入:先标记锐利边,按顶点处锐边数 s 分类:光滑 (s=0)、镖点 dart (s=1,折痕在此平滑消失)、折痕 (s=2,跨越该曲线只有 C0)、角点 (s>2);边界可把所有边界边标为锐边。查表选择对应掩码。Biermann 等改进规则,避免边界上非规则顶点处出现缝隙,并允许指定顶点法线;DeRose 等的软折痕:边先按锐边细分若干次(可以是小数次),之后用标准规则。
置换细分曲面(17.5.4 节)
凹凸贴图只改法线,轮廓不变;置换贴图真正移动表面:
s(u,v)=p(u,v)+d(u,v)n(u,v)
置换细分曲面 (Lee 等) 用粗控制网格细分出光滑极限曲面(p 为极限点,n=pu×pv 归一化),再沿法线按标量场置换。置换后法线 ns=su×sv,su=pu+dun+dnu(v 同理);置换较小时可忽略第三项 (Blinn),否则需由二阶导数求 nu。规则顶点的一二阶导数有简单掩码;非规则顶点处省略第三项。远处可改用凹凸贴图省几何处理,切线空间可取 t=pu/∥pu∥、b=n×t。Nießner 与 Loop 改用 Catmull-Clark、直接求置换函数导数并用硬件细分管线,更快。
法线、纹理坐标与颜色(17.5.5 节)
- 极限法线需要三角函数,较贵。Loop 与 Schaefer 用双三次贝塞尔面片近似 Catmull-Clark,并为 u、v 方向各导出切线面片求法线(切线面片不构成连续法线场,需额外处理);Alexa 与 Boubekeur 认为把法线也一起细分在单位计算的质量上更划算。
- 颜色(当作 RGBA 四维向量)和纹理坐标可以用与几何相同的细分方案,方案至少 C1 时颜色导数连续、不会突变。坑:纹理空间有边界时(两片共享一条边但边上纹理坐标不同),几何照常细分,纹理坐标要用边界规则。