B-Spline 曲线的重要性质:为什么它比 Bézier 更适合复杂曲线设计? #
在学习 B-Spline 曲线时,单独记住定义是不够的。真正体现 B-Spline 价值的是它的一系列性质:分段表示、局部控制、强凸包性质、节点连续性、仿射不变性等。
这些性质解释了为什么 B-Spline 在计算机图形学、CAD、曲线曲面建模中非常重要。
本文主要整理 B-Spline 曲线的几个重要性质,并解释它们的直观意义。
1. 回顾:B-Spline 曲线的定义 #
一条 p 次 B-Spline 曲线可以写成:
C(u)=i=0∑nNi,p(u)Pi其中:
- P0,P1,…,Pn 是控制点;
- Ni,p(u) 是第 i 个 p 次 B-Spline 基函数;
- u 是参数;
- C(u) 是曲线上的点;
- p 是曲线次数;
- U=u0,u1,…,um 是节点向量。
这个公式可以理解为:
曲线点=∑基函数权重×控制点也就是说,曲线上的点是控制点的加权平均。
B-Spline 的关键在于:这些权重 Ni,p(u) 不是固定的,而是由节点向量 U 和曲线次数 p 共同决定。
因此,可以记住这个关系:
节点向量→基函数权重→曲线形状
2. 性质一:B-Spline 是分段曲线 #
B-Spline 曲线 C(u) 是一条分段曲线,每一小段都是 p 次曲线。
这句话的意思是:
B-Spline 不是用一个整体高次多项式描述整条曲线,而是把参数区间按照节点分成多个小区间,每个小区间对应曲线上的一小段。
这些小区间叫做 knot span,也就是节点区间。
例如,节点向量中有相邻两个节点:
[ui,ui+1)那么这个区间就是一个 knot span。
曲线可以看成:
整条 B-Spline 曲线=====================第 1 段曲线+第 2 段曲线+⋯如果 p=3,那么每一段都是三次曲线。
这个性质非常重要,因为它说明:
B-Spline 可以用低次数曲线段组合出复杂形状。
这和 Bézier 曲线形成对比。
对于 Bézier 曲线,如果控制点数量很多,曲线次数也会变高。例如 11 个控制点对应 10 次 Bézier 曲线。高次 Bézier 曲线往往不容易控制,也不一定能很好地贴近控制多边形。
而 B-Spline 可以有很多控制点,但每一段仍然保持低次数。例如可以用三次 B-Spline 表示复杂形状。
这就是 B-Spline 的一个核心优势:
控制点数量可以很多,但曲线次数仍然可以较低。
3. 性质二:次数越低,曲线通常越贴近控制多边形 #
控制多边形是把控制点按顺序连接起来形成的折线:
P0→P1→⋯→Pn一般来说,在其他条件相近时,B-Spline 的次数越低,曲线越贴近控制多边形。
可以写成直观关系:
p↓⇒曲线更贴近控制多边形为什么会这样?
可以从影响范围理解:
- 次数越高,每个控制点影响的范围越大,曲线更“平均化”;
- 次数越低,控制点对附近曲线段的影响更直接,曲线更容易跟随控制多边形。
因此,三次 B-Spline 很常用。
它既不像一次或二次曲线那样可能不够平滑,又不像高次曲线那样难以控制。三次 B-Spline 在“平滑性”和“可控性”之间取得了很好的平衡。
4. 性质三:控制点数量、节点数量和次数必须满足固定关系 #
B-Spline 中,控制点数量、节点数量和曲线次数不能随便给。
它们必须满足:
m=n+p+1其中:
- 控制点数量是 n+1;
- 节点数量是 m+1;
- 曲线次数是 p。
因此也可以写成:
节点数量=控制点数量+p+1因为:
m+1=(n+1)+p+1举例:
如果有 10 个控制点,那么:
n+1=10所以:
n=9如果曲线次数是 3:
p=3那么:
m=n+p+1=9+3+1=13节点数量是:
m+1=14所以,10 个控制点的三次 B-Spline 需要 14 个节点。
这个性质说明:
B-Spline 比 Bézier 更灵活,但不是完全任意。控制点数量、节点数量、次数三者必须匹配。
5. 性质四:Clamped B-Spline 会经过首尾控制点 #
Clamped B-Spline 的一个重要性质是:
曲线会经过第一个控制点 P0 和最后一个控制点 Pn。
也就是:
C(ustart)=P0 C(uend)=Pn如果参数区间归一化到 [0,1],就可以写成:
C(0)=P0 C(1)=Pn
5.1 什么是 clamped? #
对于 p 次 B-Spline,如果节点向量首尾各重复 p+1 次,就叫 clamped。
首部节点满足:
u0=u1=⋯=up尾部节点满足:
um−p=um−p+1=⋯=um例如三次 B-Spline 中:
p=3所以首尾各重复:
p+1=4个节点。
一个归一化的三次 clamped knot vector 可以写成:
U={0,0,0,0,31,32,1,1,1,1}这里开头四个节点都是 0,结尾四个节点都是 1。
5.2 为什么 clamped 会让曲线经过首尾控制点? #
B-Spline 曲线是控制点的加权和:
C(u)=N0,p(u)P0+N1,p(u)P1+⋯+Nn,p(u)Pn如果在起点处,基函数权重变成:
N0,p(ustart)=1并且其他基函数权重都是 0:
N1,p(ustart)=N2,p(ustart)=⋯=Nn,p(ustart)=0那么曲线起点就是:
C(ustart)=1⋅P0+0⋅P1+⋯+0⋅Pn所以:
C(ustart)=P0clamped 节点向量的作用,就是通过首部节点重复 p+1 次,让起点处第一个基函数的权重变成 1,其他基函数权重变成 0。
终点同理。
在终点处:
Nn,p(uend)=1其他基函数为 0,所以:
C(uend)=Pn因此可以总结为:
clamped = 首尾节点各重复 p+1 次 = 曲线经过首尾控制点。
6. 性质五:强凸包性质 #
B-Spline 具有强凸包性质。
普通凸包性质是说:
曲线位于所有控制点形成的凸包内。
而 B-Spline 的强凸包性质更精细。
如果参数 u 位于 knot span:
[ui,ui+1)那么曲线点 C(u) 位于下面这些局部控制点形成的凸包内:
Pi−p,Pi−p+1,…,Pi也就是说,某一小段曲线不是被所有控制点共同控制,而是只被附近的 p+1 个控制点控制。
例如三次 B-Spline 中:
p=3所以某个 knot span 上最多只有:
p+1=4个控制点真正影响这一段曲线。
6.1 为什么叫“强”凸包性质? #
因为它不仅说整条曲线在所有控制点的大凸包里,还说:
每一小段曲线都在局部几个控制点的小凸包里。
这比普通凸包性质更强。
强凸包性质带来的好处是:
- 曲线形状更容易预测;
- 局部曲线不会远离对应的局部控制点;
- 设计者可以根据局部控制多边形判断曲线大致走向。
6.2 为什么强凸包性质成立? #
在某个 knot span 上,只有 p+1 个基函数非零。
同时,B-Spline 基函数满足:
Ni,p(u)≥0并且:
i∑Ni,p(u)=1所以曲线点:
C(u)=i∑Ni,p(u)Pi本质上是局部控制点的加权平均。
只要权重非负,并且权重和为 1,加权平均点就一定落在这些控制点形成的凸包里。
这就是强凸包性质的原因。
7. 性质六:局部修改性质 #
B-Spline 的一个核心优势是局部修改。
文章中的性质是:
改变控制点 Pi 的位置,只会影响曲线在区间 [ui,ui+p+1) 上的部分。
也就是:
Pi 只影响 C(u) 在 [ui,ui+p+1) 上的部分为什么?
因为控制点 Pi 对曲线的影响来自基函数 Ni,p(u)。
而 B-Spline 基函数有局部支撑性质:
Ni,p(u)只在区间:
[ui,ui+p+1)内可能非零。
在这个区间之外:
Ni,p(u)=0所以在区间之外,控制点 Pi 对曲线没有影响。
这就是 B-Spline 的局部控制性。
7.1 和 Bézier 曲线的区别 #
Bézier 曲线中,一个控制点通常会影响整条曲线。
而 B-Spline 中,移动一个控制点只影响有限范围内的曲线段。
这对曲线设计非常重要。
例如你已经设计好一条复杂曲线,只想微调其中一小段。使用 Bézier 曲线时,可能会牵一发动全身;使用 B-Spline 时,只需要移动附近控制点,其他部分可以保持不变。
所以 B-Spline 更适合复杂形状的局部编辑。
8. 性质七:节点重复度决定曲线连续性 #
B-Spline 的连续性和节点重复度有关。
文章中的性质是:
如果某个 knot 的重复度是 k,那么曲线在这个 knot 处具有 Cp−k 连续性。
公式是:
continuity=Cp−k其中:
- p 是曲线次数;
- k 是节点重复度;
- Cp−k 表示参数连续阶数。
8.1 普通内部节点 #
如果一个内部节点不重复,那么它的重复度是:
k=1所以连续性是:
Cp−1例如三次 B-Spline:
p=3普通内部节点处的连续性是:
C3−1=C2这意味着普通三次 B-Spline 在内部节点处通常具有二阶连续性:
因此三次 B-Spline 看起来非常平滑。
8.2 重复节点会降低连续性 #
根据公式:
Cp−k当节点重复度 k 增大时,连续性阶数会下降。
以四次 B-Spline 为例:
p=4如果是简单节点:
k=1连续性是:
C4−1=C3如果是双重节点:
k=2连续性是:
C4−2=C2如果是三重节点:
k=3连续性是:
C4−3=C1如果是四重节点:
k=4连续性是:
C4−4=C0所以:
节点重复度越高,曲线在该位置越不光滑。
这也说明节点不仅决定参数分段,还可以用来控制局部平滑程度。
9. 性质八:变差减小性质 #
B-Spline 还具有变差减小性质。
英文是:
Variation Diminishing Property
它的意思是:
如果曲线在平面中,那么任意一条直线与 B-Spline 曲线的交点数量,不会超过这条直线与控制多边形的交点数量。
可以写成:
直线与曲线的交点数≤直线与控制多边形的交点数如果曲线在三维空间中,则把“直线”换成“平面”。
这个性质的直观含义是:
B-Spline 曲线不会比控制多边形振荡得更厉害。
如果控制多边形本身比较平稳,曲线不会凭空产生很多额外波动。
这也是 B-Spline 曲线形状稳定的原因之一。
10. 性质九:Bézier 曲线是 B-Spline 的特例 #
Bézier 曲线可以看成是 B-Spline 的特殊情况。
当满足:
n=p也就是:
B-Spline 的次数=控制点数量−1并且节点向量首尾各有 p+1 个重复节点时,这条 B-Spline 就退化成 Bézier 曲线。
换句话说:
B-Spline 是 Bézier 的推广,Bézier 是 B-Spline 的特例。
这也解释了为什么它们的公式形式很像。
Bézier 曲线可以写成:
C(t)=i=0∑nBi,n(t)PiB-Spline 曲线可以写成:
C(u)=i=0∑nNi,p(u)Pi它们都是:
曲线点=∑基函数权重×控制点区别在于:
- Bézier 使用 Bernstein 基函数;
- B-Spline 使用 B-Spline 基函数;
- Bézier 的次数由控制点数量决定;
- B-Spline 的次数可以和控制点数量分离。
11. 性质十:仿射不变性 #
B-Spline 具有仿射不变性。
仿射变换包括:
仿射不变性的意思是:
对 B-Spline 曲线做仿射变换,等价于对它的控制点做同样的仿射变换。
也就是说,如果有一个仿射变换 T,那么:
T(C(u))=i=0∑nNi,p(u)T(Pi)这个性质在工程中非常方便。
如果你想旋转、缩放或平移一条 B-Spline 曲线,不需要对曲线上的所有采样点做变换,只需要对控制点做变换,然后重新生成曲线即可。
12. B-Spline 的优势总结 #
B-Spline 比 Bézier 需要更多信息:
- 需要指定曲线次数 p;
- 需要指定节点向量 U;
- 需要理解 B-Spline 基函数。
所以它的理论比 Bézier 更复杂。
但是 B-Spline 的优势也非常明显。
12.1 低次数表达复杂形状 #
B-Spline 是分段曲线,因此可以使用多个低次数曲线段组成复杂曲线。
这避免了单条高次 Bézier 曲线难以控制的问题。
12.2 控制点数量和曲线次数分离 #
Bézier 曲线中:
次数=控制点数量−1而 B-Spline 中,控制点数量和次数可以分离。
你可以有很多控制点,但仍然使用三次 B-Spline。
12.3 具有局部控制性 #
移动一个控制点 Pi 只影响:
[ui,ui+p+1)这个参数区间内的曲线。
这使得 B-Spline 非常适合局部编辑。
12.4 强凸包性质让形状更可预测 #
每一段曲线都位于局部 p+1 个控制点形成的凸包中。
这让设计者可以更直观地判断曲线形状。
12.5 节点重复度可以控制连续性 #
通过修改节点重复度,可以控制曲线在某些位置的平滑程度。
节点重复越多,连续性越低。
这让 B-Spline 可以在需要的位置产生更尖锐或更不平滑的局部效果。
13. B-Spline 的限制 #
虽然 B-Spline 很强大,但普通 B-Spline 仍然是多项式曲线。
因此它不能精确表示一些常见曲线,例如:
它可以逼近这些曲线,但不能精确表示。
如果想精确表示圆、椭圆等曲线,需要使用 B-Spline 的推广形式:
NURBS,Non-Uniform Rational B-Spline,非均匀有理 B 样条。
NURBS 在 B-Spline 的基础上加入了权重,因此表达能力更强。
14. 总结 #
B-Spline 曲线的重要性质可以概括为:
| 性质 | 含义 |
|---|
| 分段曲线 | 整条曲线由多个 p 次曲线段组成 |
| 低次数可表达复杂形状 | 不需要像 Bézier 那样提高到很高次数 |
| 数量关系 | 必须满足 m=n+p+1 |
| clamped 首尾插值 | 曲线经过 P0 和 Pn |
| 强凸包性质 | 每段曲线位于局部控制点凸包内 |
| 局部修改 | 移动一个控制点只影响有限范围 |
| 连续性由节点重复度决定 | 重复度 k 的节点处连续性为 Cp−k |
| 变差减小 | 曲线不会比控制多边形振荡得更厉害 |
| Bézier 特例 | Bézier 是 B-Spline 的特殊情况 |
| 仿射不变性 | 变换控制点等价于变换曲线 |
一句话总结:
B-Spline 用“低次数分段曲线 + 局部基函数 + 节点向量”的方式,解决了 Bézier 曲线高次数、全局控制、不便局部修改的问题,因此更适合复杂曲线和曲面设计。
如果只记住一个核心逻辑,可以记成:
节点向量决定基函数,基函数决定控制点权重,控制点权重决定曲线形状这也是理解 B-Spline 所有重要性质的主线。