【1】样条曲线的背景介绍:
在三维模型生成领域,大体可以分为以下两类:一种是对真实世界物体的数字化,另一种是根据设计师们的idea,设计出相应的三维模型。作为图形学系列文章的第一篇,我想向大家介绍在计算机辅助设计生成三维模型领域里最强大的方法:样条曲线。
在人们能够通过计算机进行模型设计之前,人们在做工业设计的时候会用一些钉子去固定一些细小的有弹性的木条或者钢片,用这些木条/钢片来设计模型结构。这样的木条/钢片被称之为样条(“spline”)。随着工业领域的数字化发展,在计算机辅助设计中钉子变成了控制点,而木条变成了计算机中的样条曲线。
【2】Bezier 曲线
样条曲线领域中最基础的一种曲线是Bezier 曲线。 Pierre Bezier 博士是雷诺汽车公司的工程师,于1960年代发明了Bezier 曲线。
Bezier 曲线模拟了其控制多边形的形状。设计师们可以通过移动控制点来快速掌握使用贝塞尔曲线设计形状的过程,而且大多数二维绘图系统,如 Adobe Illustrator,都使用贝塞尔曲线。
贝塞尔曲线的公式:
P
(
t
)
=
m
0
P
0
+
m
1
P
1
+
m
2
P
2
+
m
3
P
3
P(t) = m_0P_0+m_1P_1+m_2P_2+m_3P_3
P(t)=m0P0+m1P1+m2P2+m3P3
m
0
(
t
)
=
(
1
−
t
)
3
,
m
1
=
3
t
(
1
−
t
)
2
,
m
2
=
t
2
(
1
−
t
)
,
m
3
=
t
3
(
t
∈
[
0
,
1
]
)
m_0(t)=(1-t)^3,m_1=3t(1-t)^2,m_2=t^2(1-t),m_3=t^3(t\in[0,1])
m0(t)=(1−t)3,m1=3t(1−t)2,m2=t2(1−t),m3=t3(t∈[0,1])
Bezier 曲线得特点之一是曲线通过其第一个和最后一个控制点,并与这些端点的控制多边形相切。
【3】贝塞尔曲线的优点:
(1)精准的切线方向:
实际工程上,人们往往需要知道曲线每个点的切线方向,以运用其对三维模型做一定的操作。Bezier曲线对应的导函数可由以下参数方程构造出来。对于有n个控制点的Bezier曲线,可以构造一个具有n−1个控制点次多项式Bezier曲线,其中任意控制点
D
i
D_i
Di:
D
i
=
n
t
1
−
t
0
(
P
i
+
1
−
P
i
)
D_i=\frac{n}{t_1-t_0}(P_{i+1}-P_{i})
Di=t1−t0n(Pi+1−Pi)
对于每个
P
(
t
)
P(t)
P(t)的导数即为
D
(
t
)
D(t)
D(t).
(2)可任意细分的局部:
当人们想对一个任意小的局部进行调整时,设计师们往往需要对局部曲线进行多次细分。细分后,再在一个很小的区域对曲线进行局部的调整。Bezier曲线正好支持这一操作。Paul de Casteljau(法国雪铁龙的数学家)提出了一种对贝塞尔曲线的细分方法,它能够降 P [ t 0 , t 2 ] P[t_0,t_2] P[t0,t2]拆分成 P [ t 0 , t 1 ] P[t_0,t_1] P[t0,t1]和 P [ t 1 , t 2 ] P[t_1,t_2] P[t1,t2]两个部分。具体构造方式如下图所示:
P
i
j
=
(
1
−
t
)
P
i
j
−
1
+
t
P
i
+
1
j
−
1
;
j
=
1
,
.
.
.
,
n
;
i
=
0
,
.
.
.
,
n
−
j
;
t
∈
(
0
,
1
)
.
P_i^j=(1-t)P^{j-1}_i+tP^{j-1}_{i+1};\\j=1,...,n;i=0,...,n-j;t\in(0,1).
Pij=(1−t)Pij−1+tPi+1j−1;j=1,...,n;i=0,...,n−j;t∈(0,1).
其中
P
[
t
0
,
t
1
]
(
t
)
P_{[t_0,t_1]}(t)
P[t0,t1](t)是
P
0
0
,
P
0
1
,
P
0
2
,
P
0
3
,
.
.
.
。
P
[
t
1
,
t
2
]
(
t
)
P_0^0,P^1_0,P^2_0,P^3_0,...。P_{[t_1,t_2]}(t)
P00,P01,P02,P03,...。P[t1,t2](t)是
P
0
n
,
P
1
n
−
1
,
P
2
n
−
2
,
P
3
n
−
3
,
.
.
.
P^n_0,P^{n-1}_1,P^{n-2}_2,P^{n-3}_3,...
P0n,P1n−1,P2n−2,P3n−3,...。
(3)连续性可提升:
在工业设计领域为了获得更光滑的表面,人们往往有对任意曲线/曲面提高其连续性的需求。此时,可以通过以下方式将n-1次连续的Bezier曲线升至n次连续:
P
(
t
)
=
[
(
1
−
t
)
+
t
]
P
(
t
)
=
[
(
1
−
t
)
+
t
]
∑
i
=
0
n
P
i
B
i
n
(
t
)
=
.
.
.
=
∑
i
=
0
n
+
1
(
n
+
1
−
i
)
P
i
+
i
P
i
−
1
n
+
1
B
i
n
+
1
(
t
)
=
∑
i
=
0
n
+
1
P
i
∗
B
i
n
+
1
(
t
)
\begin{aligned} P(t) &= [(1-t)+t]P(t) \\ &=[(1-t)+t]\sum_{i=0}^n P_iB^n_i(t) \\ &= ... \\ &=\sum_{i=0}^{n+1}\frac{(n+1-i)P_i+iP_{i-1}}{n+1}B^{n+1}_i(t) \\ &=\sum_{i=0}^{n+1}P^*_iB^{n+1}_i(t) \end{aligned}
P(t)=[(1−t)+t]P(t)=[(1−t)+t]i=0∑nPiBin(t)=...=i=0∑n+1n+1(n+1−i)Pi+iPi−1Bin+1(t)=i=0∑n+1Pi∗Bin+1(t)
其中:
P
i
∗
=
a
i
P
i
−
1
+
(
1
−
a
i
)
P
i
,
a
i
=
i
n
+
1
.
\begin{aligned} P^*_i &= a_iP_{i-1}+(1-a_i)P_i, \\ a_i&=\frac{i}{n+1}. \end{aligned}
Pi∗ai=aiPi−1+(1−ai)Pi,=n+1i.
三次贝塞尔曲线升次结果示意图:
(4)曲线的范围确定:
在实际工程中,我们往往希望曲线/曲面可以落在特定的范围内,而对于Bezier曲线而言,它所生成的曲线自然地落在控制点形成的凸包范围内,如下图所示:
(5)两条贝塞尔曲线的距离上限已知:
由于贝塞尔曲线有凸包性质的保证,在工程上它又有一个无比良好的性质,即任意给定的两条Bezier曲线,它的距离上限是确定的,即两条曲线之间的距离以原点到任意控制点间的最大距离为界。如下图所示,左图为两条贝塞尔曲线及其控制点的示意图,右图是由两曲线控制点的差值作为控制点构成贝塞尔曲线。
【4】实际应用
样条曲线不仅在传统的工业设计领域,样条曲线有着大量的运用场景,如汽车的外形设计。同样在数字化时代也有着大量的运用,以下举两个例子:
曲面分割:
在对模型表面进行比较精准的切割时,如果仅仅是在模型表面精准找点分割,上述方法切割出来的曲面边界质量非常差。此时,最好的方式是选定一系列的控制点,然后,在模型表面构造样条曲线,用这条样条曲线去对模型表面进行切割。根据上文,只要这些控制点足够近(性质二保证),那些曲线只会落在一个离模型表面足够近且规定的范围内(性质四保证),足够满足实际工程的精度需求。另一方面,样条曲线本身足够光滑(性质三保证),且任意阶的导函数都已知(性质一保证),此时切割出的模型边界足够光滑,质量显著提高。在曲面分割上往往都会运用此方法。
3d设计:
在3d打印领域,人们对于精度的关注往往只在特定的区域。此时,对其他区域的精准性要求没有那么高,只要其看上去比较光滑(性质一和性质三保证),造型自然即可(性质四)。此时,通过选定一系列的控制点,在被关注的区域外围构造样条曲线和样条曲面,将其和高精度区域的曲线/曲面连在一起,即可构造出可以运用于实际需要的三维模型。
致谢:
感谢大叔chris zhang的修改意见。
参考文献::