从 B 样条曲线到 B 样条曲面:张量积构造、计算方法与性质 #
B 样条曲面并不是一套与 B 样条曲线完全不同的理论。
它可以理解为:在两个参数方向上分别使用 B 样条基函数,再将两个方向的基函数相乘,形成一个二维张量积结构。
从 B 样条曲线过渡到 B 样条曲面,核心变化可以概括为:
| B 样条曲线 | B 样条曲面 |
|---|
| 一个参数 u | 两个参数 u,v |
| 一列控制点 Pi | 二维控制点网格 Pi,j |
| 一个节点向量 U | 两个节点向量 U,V |
| 一个次数 p | 两个次数 p,q |
| 基函数 Ni,p(u) | 乘积基函数 Ni,p(u)Nj,q(v) |
| 控制多边形 | 控制网格 |
一、从 B 样条曲线过渡到 B 样条曲面 #
1. B 样条曲线回顾 #
一条 p 次 B 样条曲线定义为
C(u)=i=0∑nNi,p(u)Pi.其中:
- u 是曲线参数;
- Pi 是控制点;
- Ni,p(u) 是 p 次 B 样条基函数;
- 控制点共有 n+1 个。
节点向量为
U=u0,u1,…,ur,节点数量满足
r=n+p+1.对于一个固定的参数 u,曲线点 C(u) 是控制点 Pi 的加权组合。
2. 将控制点扩展为控制点网格 #
曲线的控制点只有一个下标:
P0,P1,…,Pn.曲面有两个参数方向,因此控制点需要排列成二维网格:
Pi,j,i=0,…,n,j=0,…,m.控制点网格可以写成
P0,0P0,1⋯P0,m P1,0P1,1⋯P1,m ⋮⋮⋮ Pn,0Pn,1⋯Pn,m.因此,从曲线到曲面的第一个变化是
控制多边形⟶控制网格
3. 把曲线的控制点替换成另一方向的曲线 #
原来的曲线为
C(u)=i=0∑nNi,p(u)Pi.现在不再让 Pi 是固定点,而是让它随着另一个参数 v 变化。
对于固定的 i,定义一条 v 方向的 q 次 B 样条曲线:
Qi(v)=j=0∑mNj,q(v)Pi,j.然后将曲线公式中的 Pi 替换为 Qi(v):
S(u,v)=i=0∑nNi,p(u)Qi(v).代入 Qi(v):
S(u,v)======i=0∑nNi,p(u)(j=0∑mNj,q(v)Pi,j).展开可得
S(u,v)=i=0∑nj=0∑mNi,p(u)Nj,q(v)Pi,j这就是张量积 B 样条曲面的定义。
4. 为什么两个方向的基函数要相乘 #
控制点 Pi,j 对曲面点 S(u,v) 的影响,需要同时考虑两个方向:
- u 方向的权重为 Ni,p(u);
- v 方向的权重为 Nj,q(v)。
因此,总权重是两个权重的乘积:
Bi,j(u,v)============Ni,p(u)Nj,q(v)这个二维基函数称为张量积基函数。
可以直观地理解为:
一个控制点只有在 u 方向和 v 方向都对当前参数点有影响时,才会对曲面点产生影响。
二、曲面的节点向量与参数域 #
1. 两个节点向量 #
曲面有两个参数方向,因此也有两个节点向量。
u 方向的节点向量为
U=u0,u1,…,ur,v 方向的节点向量为
V=v0,v1,…,vs.节点数关系分别为
r=n+p+1和
s=m+q+1.其中:
- n+1 是 u 方向控制点数;
- m+1 是 v 方向控制点数;
- p 是 u 方向次数;
- q 是 v 方向次数。
2. 夹持节点向量 #
若两个方向都采用归一化夹持节点向量,则可以写成
U=0,…,0∗p+1,u∗p+1,…,ur−p−1,p+11,…,1, V=0,…,0∗q+1,v∗q+1,…,vs−q−1,q+11,…,1.
3. 参数域 #
B 样条曲线的参数域是一个区间,而 B 样条曲面的参数域是两个区间的笛卡尔积:
(u,v)∈[up,ur−p]×[vq,vs−q]等价于
up≤u≤ur−p, vq≤v≤vs−q.如果两个方向都归一化为 [0,1],则参数域为
(u,v)∈[0,1]×[0,1]这个矩形存在于 uv 参数平面中。
需要注意:
参数域是矩形,并不意味着映射到三维空间中的曲面也是矩形。
三、固定一个参数:等参数曲线 #
B 样条曲面的一个重要性质是:固定一个参数后,得到的仍然是 B 样条曲线。
1. 固定 u=u0 #
从曲面公式出发:
S(u,v)=i=0∑nj=0∑mNi,p(u)Nj,q(v)Pi,j.令 u=u0,则
S(u0,v)=j=0∑mNj,q(v)(i=0∑nNi,p(u0)Pi,j).定义新的控制点
Qj(u0)=i=0∑nNi,p(u0)Pi,j,于是
Cu0(v)=S(u0,v)j=0∑mNj,q(v)Qj(u0)它是一条定义在节点向量 V 上的 q 次 B 样条曲线。
2. 固定 v=v0 #
类似地,
S(u,v0)=i=0∑nNi,p(u)(j=0∑mNj,q(v0)Pi,j).定义
Ri(v0)=j=0∑mNj,q(v0)Pi,j,于是
Cv0(u)=S(u,v0)i=0∑nNi,p(u)Ri(v0)它是一条定义在节点向量 U 上的 p 次 B 样条曲线。
因此:
固定 B 样条曲面的任意一个参数,都会得到一条 B 样条曲线。这些曲线称为等参数曲线。
曲面可以看成由两族纵横交错的等参数曲线编织而成。
四、曲面点的计算方法 #
1. 计算一个曲面点的五个步骤 #
对于一个给定的参数点 (u,v),计算 S(u,v) 可以分成五步。
第一步:确定 u 所在节点区间 #
寻找 i,使得
u∈[ui,ui+1).第二步:计算 u 方向非零基函数 #
只需计算
Ni−p,p(u),…,Ni,p(u).总共至多有 p+1 个。
第三步:确定 v 所在节点区间 #
寻找 j,使得
v∈[vj,vj+1).第四步:计算 v 方向非零基函数 #
只需计算
Nj−q,q(v),…,Nj,q(v).总共至多有 q+1 个。
第五步:与局部控制点相乘并求和 #
曲面点只需使用局部控制点:
S(u,v)=k=i−p∑il=j−q∑jNk,p(u)Nl,q(v)Pk,l因此,计算一个曲面点不需要遍历全部控制点,只需要至多
(p+1)(q+1)个局部控制点。
2. 矩阵形式 #
将 u 方向的非零基函数写成行向量:
NuT=[Ni−p,p(u)⋯Ni,p(u)].将 v 方向的非零基函数写成列向量:
Nv=[Nj−q,q(v) ⋮ Nj,q(v)].对应的局部控制点组成矩阵:
P=[Pi−p,j−q⋯Pi−p,j ⋮⋮ Pi,j−q⋯Pi,j].于是
S(u,v)=NuTPNv其维度关系为
1×(p+1), (p+1)×(q+1), (q+1)×1.
3. 分两次曲线求值 #
实际计算时,也可以先沿一个方向计算临时点,再沿另一个方向计算。
例如先沿 u 方向:
Ql(u)=k=i−p∑iNk,p(u)Pk,l,然后沿 v 方向:
S(u,v)=l=j−q∑jNl,q(v)Ql(u).也可以先沿 v 方向再沿 u 方向,结果完全相同。
五、张量积 B 样条基函数的性质 #
令二维基函数为
Bi,j(u,v)=Ni,p(u)Nj,q(v).这些性质大多由两个方向的一维 B 样条基函数直接推导得到。
1. 非负性 #
一维 B 样条基函数满足
Ni,p(u)≥0, Nj,q(v)≥0.因此乘积满足
Ni,p(u)Nj,q(v)≥0二维基函数不会产生负权重。
2. 规范性或单位分解 #
两个方向分别满足
i=0∑nNi,p(u)=1, j=0∑mNj,q(v)=1.因此
i=0∑nj=0∑mNi,p(u)Nj,q(v)=(i=0∑nNi,p(u))(j=0∑mNj,q(v)) =1⋅1 =1.所以
i=0∑nj=0∑mNi,p(u)Nj,q(v)=1
3. Bézier 基函数是特殊情况 #
如果
n=p,m=q,并且两个方向都没有内部节点:
U=0,…,0∗p+1,1,…,1∗p+1, V=0,…,0∗q+1,1,…,1∗q+1,则
Ni,p(u)=Bi,p(u), Nj,q(v)=Bj,q(v),其中 Bi,p 和 Bj,q 是 Bernstein 多项式。
因此
Ni,p(u)Nj,q(v)=Bi,p(u)Bj,q(v).张量积 B 样条基函数便退化为张量积 Bernstein 基函数。
4. 局部支撑性 #
一维基函数的支撑域分别为
Ni,p(u)=0,u∈/[ui,ui+p+1), Nj,q(v)=0,v∈/[vj,vj+q+1).因此,如果参数点 (u,v) 位于矩形
[ui,ui+p+1)×[vj,vj+q+1)之外,则
Ni,p(u)Nj,q(v)=0也就是说,二维基函数的支撑域是一个参数矩形。
5. 一个节点小矩形内非零基函数的数量 #
设
(u,v)∈[ui0,ui0+1)×[vj0,vj0+1).在 u 方向可能非零的基函数为
Ni0−p,p(u),…,Ni0,p(u),共 p+1 个。
在 v 方向可能非零的基函数为
Nj0−q,q(v),…,Nj0,q(v),共 q+1 个。
因此,一个节点小矩形中至多有
(p+1)(q+1)个张量积基函数非零。
6. 唯一最大值 #
若 p>0 且 q>0,则张量积基函数
Ni,p(u)Nj,q(v)在其支撑域中只达到一次最大值。
直观上,二维基函数的峰值位置由两个一维基函数各自的峰值位置共同决定。
7. 分片二元多项式性质 #
在由相邻节点线构成的开矩形内部:
(u,v)∈(uk,uk+1)×(vl,vl+1),一维基函数分别是关于 u 和 v 的多项式。
因此
Ni,p(u)Nj,q(v)是一个二元多项式:
- 关于 u 的次数不超过 p;
- 关于 v 的次数不超过 q。
所以 B 样条曲面是分片双变量多项式曲面。
8. 基函数的连续性 #
若 u 方向某个内部节点的重复度为 k,则基函数关于 u 通常具有
Cp−k连续性。
若 v 方向某个内部节点的重复度为 k,则基函数关于 v 通常具有
Cq−k连续性。
例如,当 p=3 时:
- 简单节点 k=1:关于 u 为 C2;
- 二重节点 k=2:关于 u 为 C1;
- 三重节点 k=3:关于 u 为 C0。
两个参数方向的连续性可以分别控制。
六、B 样条曲面的几何性质 #
1. Bézier 曲面是特殊的 B 样条曲面 #
当 n=p、m=q,且两个方向都没有内部节点时:
S(u,v)=i=0∑pj=0∑qBi,p(u)Bj,q(v)Pi,j.这正是张量积 Bézier 曲面。
因此
Beˊzier 曲面是单曲面片的 B 样条曲面。
2. 角点插值性质 #
若两个节点向量都是首尾夹持的,并且参数域为 [0,1]2,则曲面插值控制网格的四个角点:
S(0,0)=P0,0 S(1,0)=Pn,0 S(0,1)=P0,m S(1,1)=Pn,m这是曲线端点插值性质在两个方向上的推广。
3. 四条边界是 B 样条曲线 #
对于夹持曲面,四条边界分别为:
S(0,v)=j=0∑mNj,q(v)P0,j, S(1,v)=j=0∑mNj,q(v)Pn,j, S(u,0)=i=0∑nNi,p(u)Pi,0, S(u,1)=i=0∑nNi,p(u)Pi,m.因此,曲面的四条边界本身都是 B 样条曲线,并分别由控制网格最外侧的一行或一列控制点决定。
4. 仿射不变性 #
设仿射变换为
T(X)=AX+b.对曲面进行仿射变换:
T(S(u,v))=A(i∑j∑Ni,p(u)Nj,q(v)Pi,j)+b.利用规范性
i∑j∑Ni,p(u)Nj,q(v)=1,得到
T(S(u,v))=i∑j∑Ni,p(u)Nj,q(v)(APi,j+b) =i∑j∑Ni,p(u)Nj,q(v)T(Pi,j).所以
T(S(u,v))=i∑j∑Ni,p(u)Nj,q(v)T(Pi,j)即:
对整张曲面做仿射变换,等价于对所有控制点做同样的仿射变换,再重新构造曲面。
5. 凸包性质 #
曲面点写成
S(u,v)=i∑j∑wi,j(u,v)Pi,j,其中
wi,j(u,v)=Ni,p(u)Nj,q(v).由于
wi,j(u,v)≥0且
i∑j∑wi,j(u,v)=1,所以 S(u,v) 是控制点的凸组合。
因此
S(u,v) 位于整个控制网格的凸包内
6. 强凸包性质 #
设
(u,v)∈[ui0,ui0+1)×[vj0,vj0+1).则当前曲面点只受以下控制点影响:
Pi,j,其中
i=i0−p,…,i0, j=j0−q,…,j0.因此
S(u,v) 位于这 (p+1)(q+1) 个局部控制点的凸包内这就是 B 样条曲面的强凸包性质。
例如,对于 3×2 次曲面,即 p=3、q=2,一个局部曲面片至多由
(3+1)(2+1)=12个控制点决定。
7. 控制网格的三角化逼近 #
将控制网格中的每个四边形拆分成三角形,可以得到一个由平面三角片组成的分片线性曲面。
这个三角网格可以作为 B 样条曲面的平面片逼近。
一般来说:
曲面次数越低,控制网格的三角化通常越接近实际曲面。但控制网格本身通常并不位于曲面上,它只是曲面的几何控制结构。
8. 局部修改性 #
控制点 Pi,j 对应的基函数支撑域为
[ui,ui+p+1)×[vj,vj+q+1).因此,移动控制点 Pi,j,只会影响该参数矩形对应的局部曲面区域。
即
修改一个控制点,只会局部改变曲面。这也是 B 样条曲面适合交互式几何建模的重要原因。
9. 曲面的连续性与可微性 #
曲面
S(u,v)=i∑j∑Ni,p(u)Nj,q(v)Pi,j的连续性与可微性由基函数决定。
若 u 方向某节点重复度为 k,则曲面跨越相应节点线时,关于 u 通常为
Cp−k.若 v 方向某节点重复度为 k,则曲面关于 v 通常为
Cq−k.因此:
- 增加 u 方向节点重复度,会降低跨越对应 u 节点线时的光滑性;
- 增加 v 方向节点重复度,会降低跨越对应 v 节点线时的光滑性。
10. 重复节点与重复控制点的区别 #
产生尖锐特征有两种不同方式。
重复节点 #
重复节点会直接降低基函数和曲面的参数连续阶数。
例如三次方向 p=3:
- 简单节点:C2;
- 二重节点:C1;
- 三重节点:C0。
重复控制点 #
如果相邻的若干控制点重合,可以形成明显的尖锐隆起、脊线或皱折。
但需要注意:
重复控制点不一定改变基函数本身的连续阶数。
曲面在参数意义上可能仍然具有较高阶连续性,但几何外观上可以非常尖锐。
七、曲线性质不能全部机械推广到曲面 #
多数 B 样条曲线性质都可以通过张量积推广到曲面,例如:
- 非负性;
- 单位分解;
- 局部性;
- 凸包性;
- 仿射不变性;
- 连续性;
- 局部修改性。
但是,并不是所有曲线性质都能直接推广。
书中特别指出:
B 样条曲面一般不具有与 B 样条曲线完全对应的变差减小性。对于曲线,可以利用控制多边形与直线的交点数来研究曲线的振荡程度。
但对于二维曲面,并不存在一个同样简单、直接对应的变差减小结论。
八、B 样条曲线与曲面的对应关系 #
| 曲线中的概念 | 曲面中的推广 |
|---|
| 参数 u | 参数对 (u,v) |
| 控制点 Pi | 控制点网格 Pi,j |
| 控制多边形 | 控制网格 |
| 节点向量 U | 节点向量 U,V |
| 次数 p | 双次数 (p,q) |
| 基函数 Ni,p(u) | Ni,p(u)Nj,q(v) |
| 参数域为区间 | 参数域为矩形 |
| 局部 p+1 个基函数非零 | 局部至多 (p+1)(q+1) 个基函数非零 |
| 固定参数得到一个点 | 固定一个参数得到一条等参数曲线 |
| 端点插值 | 四角点插值 |
| 局部凸包 | 局部控制点网格的凸包 |
| 修改一个控制点影响局部曲线 | 修改一个控制点影响局部曲面 |
| Bézier 曲线是特殊情况 | Bézier 曲面是特殊情况 |
九、总结 #
B 样条曲面是 B 样条曲线在两个参数方向上的张量积推广。
从曲线
C(u)=i=0∑nNi,p(u)Pi出发,将控制点替换为另一方向上的 B 样条曲线,就得到
S(u,v)=i=0∑nj=0∑mNi,p(u)Nj,q(v)Pi,j理解 B 样条曲面时,可以抓住以下几个核心观点:
曲面有两个参数。
u 和 v 分别控制两个参数方向。
控制点由一列变成二维网格。
控制多边形推广为控制网格。
二维基函数是两个一维基函数的乘积。
Bi,j(u,v)=Ni,p(u)Nj,q(v).固定一个参数,就得到一条 B 样条曲线。
曲面由两族等参数曲线组成。
局部曲面点只受有限控制点影响。
在一个节点小矩形中,最多只有
(p+1)(q+1)个控制点参与计算。
曲线的多数性质可以推广到曲面。
包括非负性、规范性、凸包性、仿射不变性、局部修改性和连续性。
连续性可以在两个方向分别控制。
u 方向由次数 p 和节点向量 U 中的节点重复度决定,v 方向由次数 q 和节点向量 V 中的节点重复度决定。
因此,B 样条曲面可以看成:
用两个方向的 B 样条曲线,通过张量积编织而成的曲面。(完)