中EN
概念页

细分曲线与细分曲面

Subdivision Curves & Surfaces

细分从一个控制多边形 / 控制网格出发,反复"细化 + 平滑",极限是光滑的曲线或曲面。它能从任意拓扑的网格得到连续、无裂缝的曲面,规则简单、天然支持无限 LOD,连接了离散三角网格与连续曲面。游戏和电影最常用的是 Catmull-Clark(四边形)和 Loop(三角形)两种逼近型方案,可扩展出折痕和置换细分。

细分曲线(17.4 节)

  • Chaikin 切角(逼近型):每对相邻顶点之间生成两个新点,丢弃旧点: p2ik+1=34pik+14pi+1k,p2i+1k+1=14pik+34pi+1k\mathbf{p}^{k+1}_{2i}=\tfrac34\mathbf{p}^k_i+\tfrac14\mathbf{p}^k_{i+1},\qquad \mathbf{p}^{k+1}_{2i+1}=\tfrac14\mathbf{p}^k_i+\tfrac34\mathbf{p}^k_{i+1} 极限曲线 P∞P^\infty 是二次 B 样条;可看成去掉尖角(高频)的低通滤波。开放折线保留两个端点即可让曲线经过端点。
  • 4 点方案(插值型,保留上一层所有点): p2ik+1=pik,p2i+1k+1=(12+w)(pik+pi+1k)−w(pi−1k+pi+2k)\mathbf{p}^{k+1}_{2i}=\mathbf{p}^k_i,\qquad \mathbf{p}^{k+1}_{2i+1}=\Big(\tfrac12+w\Big)(\mathbf{p}^k_i+\mathbf{p}^k_{i+1})-w(\mathbf{p}^k_{i-1}+\mathbf{p}^k_{i+2}) ww 为张力,w=0w=0 即线性插值,0<w<1/80<w<1/8 时 C1C^1,常用 1/161/16。开放折线端点处把相邻点关于端点反射:p−1=2p0−p1\mathbf{p}_{-1}=2\mathbf{p}_0-\mathbf{p}_1。
  • 另一种逼近方案 p2ik+1=34pik+18(pi−1k+pi+1k)\mathbf{p}^{k+1}_{2i}=\tfrac34\mathbf{p}^k_i+\tfrac18(\mathbf{p}^k_{i-1}+\mathbf{p}^k_{i+1})、新点取中点,生成三次 B 样条。
  • 可以直接把点或切线"推"到极限曲线上。

细分曲面的框架(17.5 节)

每一步分两个阶段:细化(生成新顶点并重新连接成更小的面)和平滑(计算部分或全部顶点的新位置)。方案按以下特征分类:逼近 / 插值、静态(每步规则相同)/ 非静态、均匀 / 非均匀(边界边常用不同规则)、基于三角形 / 基于多边形。

flowchart LR
  M["控制网格"] --> R["细化: 插入边点/面点, 重连"]
  R --> S["平滑: 按掩码加权更新位置"]
  S --> R
  S --> L["极限曲面: 也可用闭式直接求极限点和切线"]

如上图,细化与平滑交替进行;掩码 (mask / stencil) 用一张图就能表达整个方案,且权重总和为 1,保证新点位于被加权点的邻域内。

Loop 细分(17.5.1 节)

第一个三角形细分方案,逼近型,每个三角形分成 4 个,nn 步后为 4n4^n 个。顶点度为 6 称为规则,否则为非规则 (extraordinary)。对度为 nn 的顶点 pk\mathbf{p}^k 及其 1 环邻点 pik\mathbf{p}^k_i: pk+1=(1−nβ)pk+β(p0k+⋯+pn−1k),pik+1=3pk+3pik+pi−1k+pi+1k8\mathbf{p}^{k+1}=(1-n\beta)\mathbf{p}^k+\beta(\mathbf{p}^k_0+\dots+\mathbf{p}^k_{n-1}),\qquad \mathbf{p}^{k+1}_i=\frac{3\mathbf{p}^k+3\mathbf{p}^k_i+\mathbf{p}^k_{i-1}+\mathbf{p}^k_{i+1}}{8} β(n)=1n(58−(3+2cos⁡(2π/n))264)\beta(n)=\frac1n\Big(\frac58-\frac{(3+2\cos(2\pi/n))^2}{64}\Big) 规则顶点处 C2C^2,非规则顶点处 C1C^1;细分只产生规则顶点,所以只有控制网格中原本的非规则顶点处是 C1C^1。Warren 与 Weimer 的无三角函数变体 β(n)=3n(n+2)\beta(n)=\dfrac{3}{n(n+2)} 效果几乎无法区分。

  • 极限位置:把上面第一式中的 β(n)\beta(n) 换成 γ(n)=1n+38β(n)\gamma(n)=\dfrac{1}{n+\frac{3}{8\beta(n)}}。
  • 极限切线:tu=∑icos⁡(2πi/n)pik\mathbf{t}_u=\sum_i\cos(2\pi i/n)\mathbf{p}^k_i,tv=∑isin⁡(2πi/n)pik\mathbf{t}_v=\sum_i\sin(2\pi i/n)\mathbf{p}^k_i,法线 tu×tv\mathbf{t}_u\times\mathbf{t}_v,通常比平均邻面法线更便宜且是精确法线。
  • 非封闭网格需要边界规则(可用上面三次 B 样条曲线规则)。
  • 逼近型的优缺点:曲面更"光顺"(fair)、收敛更快;但会收缩,小而凸的网格(如四面体)最明显,需在控制网格中多放顶点;Loop 曲面位于原控制点凸包内。全规则网格时 Loop 曲面是三方向四次箱样条。

Catmull-Clark 细分(17.5.2 节)

能处理任意多边形的最著名方案(另一个是 Doo-Sabin),用于皮克斯《Geri's Game》《玩具总动员 2》及之后所有长片,也是游戏建模最常用的方案。它生成更对称的曲面(长方盒得到对称的类椭球体,而三角形方案结果取决于正方形怎么切)。第一步后只生成四边形,规则顶点度为 4。

  • 每个面生成面点 fk+1\mathbf{f}^{k+1}(面质心);对度为 nn 的顶点 vk\mathbf{v}^k 及周围边点 ejk\mathbf{e}^k_j: vk+1=n−2nvk+1n2∑j=0n−1ejk+1n2∑j=0n−1fjk+1,ejk+1=vk+ejk+fj−1k+1+fjk+14\mathbf{v}^{k+1}=\frac{n-2}{n}\mathbf{v}^k+\frac{1}{n^2}\sum_{j=0}^{n-1}\mathbf{e}^k_j+\frac{1}{n^2}\sum_{j=0}^{n-1}\mathbf{f}^{k+1}_j,\qquad \mathbf{e}^{k+1}_j=\frac{\mathbf{v}^k+\mathbf{e}^k_j+\mathbf{f}^{k+1}_{j-1}+\mathbf{f}^{k+1}_j}{4}
  • 全规则时等价于双三次 B 样条曲面(见 参数曲面与贝塞尔面片),能处理非规则配置正是其优势;极限位置与切线有显式公式。GPU 渲染见 高效曲面细分。

分段光滑细分:折痕(17.5.3 节)

Hoppe 等为 Loop 曲面引入:先标记锐利边,按顶点处锐边数 ss 分类:光滑 (s=0s=0)、镖点 dart (s=1s=1,折痕在此平滑消失)、折痕 (s=2s=2,跨越该曲线只有 C0C^0)、角点 (s>2s>2);边界可把所有边界边标为锐边。查表选择对应掩码。Biermann 等改进规则,避免边界上非规则顶点处出现缝隙,并允许指定顶点法线;DeRose 等的软折痕:边先按锐边细分若干次(可以是小数次),之后用标准规则。

置换细分曲面(17.5.4 节)

凹凸贴图只改法线,轮廓不变;置换贴图真正移动表面: s(u,v)=p(u,v)+d(u,v) n(u,v)\mathbf{s}(u,v)=\mathbf{p}(u,v)+d(u,v)\,\mathbf{n}(u,v) 置换细分曲面 (Lee 等) 用粗控制网格细分出光滑极限曲面(p\mathbf{p} 为极限点,n=pu×pv\mathbf{n}=\mathbf{p}_u\times\mathbf{p}_v 归一化),再沿法线按标量场置换。置换后法线 ns=su×sv\mathbf{n}_s=\mathbf{s}_u\times\mathbf{s}_v,su=pu+dun+d nu\mathbf{s}_u=\mathbf{p}_u+d_u\mathbf{n}+d\,\mathbf{n}_u(vv 同理);置换较小时可忽略第三项 (Blinn),否则需由二阶导数求 nu\mathbf{n}_u。规则顶点的一二阶导数有简单掩码;非规则顶点处省略第三项。远处可改用凹凸贴图省几何处理,切线空间可取 t=pu/∥pu∥\mathbf{t}=\mathbf{p}_u/\lVert\mathbf{p}_u\rVert、b=n×t\mathbf{b}=\mathbf{n}\times\mathbf{t}。Nießner 与 Loop 改用 Catmull-Clark、直接求置换函数导数并用硬件细分管线,更快。

法线、纹理坐标与颜色(17.5.5 节)

  • 极限法线需要三角函数,较贵。Loop 与 Schaefer 用双三次贝塞尔面片近似 Catmull-Clark,并为 u、v 方向各导出切线面片求法线(切线面片不构成连续法线场,需额外处理);Alexa 与 Boubekeur 认为把法线也一起细分在单位计算的质量上更划算。
  • 颜色(当作 RGBA 四维向量)和纹理坐标可以用与几何相同的细分方案,方案至少 C1C^1 时颜色导数连续、不会突变。坑:纹理空间有边界时(两片共享一条边但边上纹理坐标不同),几何照常细分,纹理坐标要用边界规则。
  1. realtime_rendering_4ed.pdf 第 17 章 Curves and Curved Surfaces

相关页面

图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。游戏数学埃尔米特与 Kochanek-Bartels 样条Hermite & Kochanek-Bartels Splines三次 Hermite 曲线用两个端点和两个端点切线定义,比贝塞尔控制点更直观;把多段 Hermite 曲线串起来经过一系列点时,Kochanek-Bartels 用张力、偏置、连续性三个参数从相邻弦计算切线,默认参数即 Catmull-Rom 样条。均匀三次 B 样条则以不经过控制点为代价换来处处 C^2 连续。图形学高效曲面细分Efficient Tessellation实时渲染曲面需要把它细分成三角网格。与其在 CPU 上细分后传大量三角形,不如把曲面描述送到 GPU,由硬件细分管线(外壳着色器 → 细分器 → 域着色器)展开。本页讲分数细分因子、按曲率/屏幕尺寸/轮廓决定细分率的自适应细分、避免裂缝与跳变的方法,以及 Catmull-Clark 曲面的快速 GPU 渲染(近似面片、OpenSubdiv 特征自适应细分、自适应四叉树)。图形学法线贴图与凹凸贴图Normal & Bump Mapping凹凸贴图是一类在像素着色中修改着色法线来表现中尺度细节的技术:几何法线不变,只改变光照计算使用的法线,从而在不增加几何的情况下显得更立体。最常用的形式是切线空间法线贴图,需要每顶点的切线框架;法线贴图的过滤是难点。图形学网格整合与顶点法线Mesh Consolidation & Vertex Normals整合 (consolidation) 指把零散多边形合并成共享顶点的网格、让所有面朝向一致、判断是否为实体,并生成平滑的顶点法线与折痕边。这些步骤是背面剔除、折痕检测、阴影体、碰撞检测、3D 打印等的前提。图形学网格简化Mesh Simplification网格简化(数据缩减、抽取 decimation)在尽量保持外观的前提下减少三角形数,使应用能在低端机器上伸缩。核心操作是可逆的边折叠,用代价函数(典型是 Garland–Heckbert 的二次误差度量 QEM)排序;它产生的渐进网格可用于连续 LOD 与渐进传输,但自动化并非万能。游戏数学贝塞尔曲线Bézier Curves参数曲线 \mathbf{p}(t) 用参数 t 生成连续的点,实时图形中常用于让相机或物体沿预定路径移动(与帧率无关),也用于渲染头发和字体。贝塞尔曲线由反复线性插值(de Casteljau 算法)得到,等价于 Bernstein 多项式加权控制点;多段拼接时要关注 C^n / G^n 连续性。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原