中EN
概念页

埃尔米特与 Kochanek-Bartels 样条

Hermite & Kochanek-Bartels Splines

更新于 2026-10-11 约 6 分钟曲线插值样条HermiteCatmull-RomB 样条张力

三次 Hermite 曲线用两个端点和两个端点切线定义,比贝塞尔控制点更直观;把多段 Hermite 曲线串起来经过一系列点时,Kochanek-Bartels 用张力、偏置、连续性三个参数从相邻弦计算切线,默认参数即 Catmull-Rom 样条。均匀三次 B 样条则以不经过控制点为代价换来处处 C2C^2 连续。

三次 Hermite 插值(17.1.4 节)

p(t)=(2t3−3t2+1)p0+(t3−2t2+t)m0+(t3−t2)m1+(−2t3+3t2)p1,t∈[0,1]\mathbf{p}(t)=(2t^3-3t^2+1)\mathbf{p}_0+(t^3-2t^2+t)\mathbf{m}_0+(t^3-t^2)\mathbf{m}_1+(-2t^3+3t^2)\mathbf{p}_1,\quad t\in[0,1] 满足 p(0)=p0\mathbf{p}(0)=\mathbf{p}_0、p(1)=p1\mathbf{p}(1)=\mathbf{p}_1、p′(0)=m0\mathbf{p}'(0)=\mathbf{m}_0、p′(1)=m1\mathbf{p}'(1)=\mathbf{m}_1。切线越长对整体形状影响越大。应用:NVIDIA "Nalu" 演示中,用粗的控制发丝做动画和碰撞检测,计算切线后细分三次曲线渲染头发(见 毛发渲染)。

Kochanek-Bartels 曲线(17.1.5 节)

nn 个点 p0…pn−1\mathbf{p}_0\dots\mathbf{p}_{n-1} 用 n−1n-1 段 Hermite 曲线插值,内部切线由两条弦 pi−pi−1\mathbf{p}_i-\mathbf{p}_{i-1} 和 pi+1−pi\mathbf{p}_{i+1}-\mathbf{p}_i 组合得到。

  • 张力 aa(控制接点处的尖锐程度): mi=1−a2[(pi−pi−1)+(pi+1−pi)]\mathbf{m}_i=\frac{1-a}{2}\big[(\mathbf{p}_i-\mathbf{p}_{i-1})+(\mathbf{p}_{i+1}-\mathbf{p}_i)\big] 默认 a=0a=0;越大弯曲越尖(a>1a>1 时接点处出现环),负值则更松弛。
  • 偏置 bb(控制切线方向): mi=(1−a)(1+b)2(pi−pi−1)+(1−a)(1−b)2(pi+1−pi)\mathbf{m}_i=\frac{(1-a)(1+b)}{2}(\mathbf{p}_i-\mathbf{p}_{i-1})+\frac{(1-a)(1-b)}{2}(\mathbf{p}_{i+1}-\mathbf{p}_i) 正偏置更偏向弦 pi−pi−1\mathbf{p}_i-\mathbf{p}_{i-1},负偏置偏向另一条。全部取默认值即 Catmull-Rom 样条。首末点的切线可令其中一条弦长度为零来计算。
  • 连续性 cc:每个接点有入切线 si\mathbf{s}_i 和出切线 di\mathbf{d}_i(pi\mathbf{p}_i 到 pi+1\mathbf{p}_{i+1} 段使用 di\mathbf{d}_i 与 si+1\mathbf{s}_{i+1}): si=1−c2(pi−pi−1)+1+c2(pi+1−pi),di=1+c2(pi−pi−1)+1−c2(pi+1−pi)\mathbf{s}_i=\frac{1-c}{2}(\mathbf{p}_i-\mathbf{p}_{i-1})+\frac{1+c}{2}(\mathbf{p}_{i+1}-\mathbf{p}_i),\quad \mathbf{d}_i=\frac{1+c}{2}(\mathbf{p}_i-\mathbf{p}_{i-1})+\frac{1-c}{2}(\mathbf{p}_{i+1}-\mathbf{p}_i) c=0c=0 时 si=di\mathbf{s}_i=\mathbf{d}_i;c=−1c=-1 时得到只有 C0C^0 的尖角。三者合并: si=(1−a)(1+b)(1−c)2(pi−pi−1)+(1−a)(1−b)(1+c)2(pi+1−pi)\mathbf{s}_i=\frac{(1-a)(1+b)(1-c)}{2}(\mathbf{p}_i-\mathbf{p}_{i-1})+\frac{(1-a)(1-b)(1+c)}{2}(\mathbf{p}_{i+1}-\mathbf{p}_i) di=(1−a)(1+b)(1+c)2(pi−pi−1)+(1−a)(1−b)(1−c)2(pi+1−pi)\mathbf{d}_i=\frac{(1-a)(1+b)(1+c)}{2}(\mathbf{p}_i-\mathbf{p}_{i-1})+\frac{(1-a)(1-b)(1-c)}{2}(\mathbf{p}_{i+1}-\mathbf{p}_i)
  • 坑:时间间隔不等。上式只在各段时间长度相同时成立。设 Δi=ti+1−ti\Delta_i=t_{i+1}-t_i,需调整为 si′=si2ΔiΔi−1+Δi,di′=di2Δi−1Δi−1+Δi\mathbf{s}'_i=\mathbf{s}_i\frac{2\Delta_i}{\Delta_{i-1}+\Delta_i},\qquad \mathbf{d}'_i=\mathbf{d}_i\frac{2\Delta_{i-1}}{\Delta_{i-1}+\Delta_i} 否则路径上的速度会在接点处突变(与 贝塞尔曲线 中的 C1C^1 条件同理)。

均匀三次 B 样条(17.1.6 节)

sn(t)=∑kckβn(t−k)s^n(t)=\sum_k c_k\beta^n(t-k)。三次基函数由三段拼成: β3(t)={0,∣t∣≥216(2−∣t∣)3,1≤∣t∣<223−12∣t∣2(2−∣t∣),∣t∣<1\beta^3(t)=\begin{cases}0, & |t|\ge 2\\ \tfrac{1}{6}(2-|t|)^3, & 1\le |t|<2\\ \tfrac{2}{3}-\tfrac{1}{2}|t|^2(2-|t|), & |t|<1\end{cases} β0\beta^0 是方波,逐次积分得到帐篷函数 β1\beta^1、C1C^1 的 β2\beta^2、C2C^2 的 β3\beta^3;nn 次曲线为 Cn−1C^{n-1}。求值只用四个控制点(局部支撑): s3(i+α)=w0(α)ci−1+w1(α)ci+w2(α)ci+1+w3(α)ci+2s^3(i+\alpha)=w_0(\alpha)c_{i-1}+w_1(\alpha)c_i+w_2(\alpha)c_{i+1}+w_3(\alpha)c_{i+2} w0=16(1−α)3,w1=23−12α2(2−α),w2=23−12(1−α)2(1+α),w3=16α3w_0=\tfrac16(1-\alpha)^3,\quad w_1=\tfrac23-\tfrac12\alpha^2(2-\alpha),\quad w_2=\tfrac23-\tfrac12(1-\alpha)^2(1+\alpha),\quad w_3=\tfrac16\alpha^3 x、y 分别用 B 样条即得到平面曲线。控制点非均匀分布时公式更复杂但更灵活。

选型

曲线经过控制点连续性适用
贝塞尔(分段)只经过端点需手动保证 G1G^1/C1C^1理论基础、字体、精确控制形状
Hermite / Kochanek-Bartels / Catmull-Rom是C1C^1(c≠0c\ne0 时可故意降为 C0C^0)相机路径、关键帧动画,参数直观
均匀三次 B 样条否C2C^2要求非常平滑的曲线,曲面(Catmull-Clark)基础
  1. realtime_rendering_4ed.pdf 第 17 章 Curves and Curved Surfaces

相关页面

游戏数学贝塞尔曲线Bézier Curves参数曲线 \mathbf{p}(t) 用参数 t 生成连续的点,实时图形中常用于让相机或物体沿预定路径移动(与帧率无关),也用于渲染头发和字体。贝塞尔曲线由反复线性插值(de Casteljau 算法)得到,等价于 Bernstein 多项式加权控制点;多段拼接时要关注 C^n / G^n 连续性。图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。图形学细分曲线与细分曲面Subdivision Curves & Surfaces细分从一个控制多边形 / 控制网格出发,反复"细化 + 平滑",极限是光滑的曲线或曲面。它能从任意拓扑的网格得到连续、无裂缝的曲面,规则简单、天然支持无限 LOD,连接了离散三角网格与连续曲面。游戏和电影最常用的是 Catmull-Clark(四边形)和 Loop(三角形)两种逼近型方案,可扩展出折痕和置换细分。图形学毛发渲染Hair & Fur Rendering毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。游戏开发 · UE5PCG 程序化内容生成框架PCG FrameworkPCG 框架把程序化内容表达为「点流」:PCG 组件/体积从关卡采样空间数据,图中的 Sampler 生成带变换、密度、种子与自定义属性的点,经过滤与变换后由 Spawner 生成网格或 Actor,编辑器中实时更新,也可运行时生成。属性分为 $ 静态属性和元数据动态属性,按 @Data/@Points/@Elements 域组织;图参数与图实例的用法类似材质参数与材质实例;与世界分区集成,生成物继承数据层与 HLOD 层。游戏开发动画压缩Animation Compression未压缩的动画每关节每样本最多 10 个 32 位浮点通道,数据量巨大。GEA 列出的压缩手段按力度递增:省略无用通道、量化(如 16 位 RL 编码)、降低采样率或省略近似线性的关键帧、用 B 样条拟合曲线、小波压缩,以及最根本的:只把需要的片段放进内存(选择性加载与流式加载)(GEA4 卷 II 13.8)。游戏开发数据驱动与游戏世界编辑器Data-Driven Engines & Game World Editors当游戏行为可以部分或全部由美术和策划提供的数据控制,而不只由程序员写的代码控制时,引擎就是数据驱动的。它能提高团队效率、缩短迭代时间,但工具、健壮的运行时和预览手段都要花大量成本,过度设计反而降低生产力,所以要权衡并坚持 KISS。玩法领域里对应 DCC 工具的是游戏世界编辑器:创建世界块并放入静态和动态元素、设定对象初始状态和行为。GEA 列出了它的典型功能,并比较了不同引擎在何时做平台相关优化上的取舍(GEA4 卷 II 16.3–16.4)。

输入关键词开始搜索

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