OpenGL绘制任意阶次B样条曲线
一、B样条曲线简介
在B样条曲线发展起来之前,利用计算机画曲线,大多利用的是Bezier曲线,但Bezier曲线有三点不足之处:
- 特征多边形顶点数决定了Bezier曲线的阶次,n很大时,特征多边形对形状的控制将减弱。
- Bezier曲线不能作局部修改,改变任一控制点将波及整条曲线。
- 绘制复杂曲线需要拼接,比较繁琐。
因此在这样的背景下,B样条曲线诞生了。B样条曲线就具有了两个Bezier曲线所不具备的优点:
- B样条次数可独立于控制点数目(但也有一个定的限制);
- B样条允许局部控制曲线(面);
但同样,B样条曲线相较于Bezier曲线也更加复杂。
B样条曲线可以看作是Bezier曲线的一种变化,但B样条曲线仍然不能表达所有曲线,如圆。所有B样条曲线可以经过拓展转百年为NURBS,即非均匀有理B样条曲线。
B样条曲线的上的点的坐标位置可以通过下面这个公式来表达:
P ( t ) = ∑ k = 0 n p k B k , d ( t ) , 其 中 t m i n ≤ t ≤ t a m x , 2 ≤ d ≤ n + 1 P(t)=\sum_{k=0}^{n}p_kB_{k,d}(t),其中 t_{min}\leq t \leq t_{amx},2\leq d\leq n+1 P(t)=k=0∑npkBk,d(t),其中tmin≤t≤tamx,2≤d≤n+1
这里的 p k p_k pk是输入的一组n + 1个的控制点,即x, y坐标; B k , d ( t ) B_{k,d}(t) Bk,d(t)是B样条曲线的基函数, 其中d是b样条曲线的次数,在我们讲这个基函数之前,还需要知道另一个参数:节点向量 U:设U 是m + 1个非递减数的集合, u 0 ≤ u 1 ≤ u 2 ≤ . . . ≤ u m u_0 \leq u_1 \leq u_2 \leq ... \leq u_m u0≤u1≤u2≤...≤um。 u i u_i ui称为节点, 集合U 称为节点向量,其中若 u i + 1 − u i = C u_{i+1}-u_i=C ui+1−ui=C即节点矢量是均匀的,反之则称为非均匀的。
因此要想构成一条B样条曲线就需要知道以上这个几个加粗的参数,具体作用如下:
- 控制点p:决定曲线走向的控制顶点,由 ( x , y ) (x,y)