因为B样条曲面是在s,t两个方向上的两组B样条曲线组合而成的,了解了B样条曲线也就了解了B样条曲面,所以下面仅讲了B样条曲线。
沿B样条曲线的坐标位置可表示为:
其中,umin≤ u ≤umax ,2≤ d ≤n+1
n+1为控制点个数,Pk是第k个控制点,Bk,d是次数为2~d-1的多项式。
Bk,d(u)递归定义为:
请注意以下B样条性质:
- 在u值域内,多项式次数为d-1
- 对于n+1个控制点,曲线由n+1个混合函数描述
- 每个混合函数Bk,d定义域为u值域的d子区间,以节点向量值uk为起点。
- 参数u的值域由n+d+1个给定节点向量值分成n+d个子区间
- 节点记为{u0,u1,u2,…,un+d},生成的样条曲线仅定义在从节点值ud-1到节点值un+1区间上
- 每个样条曲线段(在两个相邻节点值间)受d个控制点影响。
- 一个控制点可以影响最多d个曲线段的影响。
非均匀样条:节点向量的值与间距可以为任意值值。这样我们可以在不同区间上得到不同的混合函数形状,为自由控制曲线形状提供了更大自由。
关于节点向量值:均匀与非均匀的主要区别在于节点向量的值。如果适当设定节点向量,可以生成一种开放均匀样条,它是均匀与非均匀的交叉部分。开放样条在两端的节点值会重复d次,其节点间距是均匀的。例如:
{0,0,1,2,3,3},(d=2,n=3)
{{0,0,0,1,2,2,2},(d=4,n=4)。
开放均匀B样条与贝泽尔样条性质非常类似,如果d=n+1(即多项式次数为n),那么开放B样条就变成了贝泽尔样条,所有节点值为0或1。如四个控制点的三次开放B样条,节点向量为:{0,0,0,0,1,1,1}。
有理B样条:有理函数是两个多项式之比,有理样条(rational spline)是两上样条函数之比,有理B样条用向量描述为:
其中Pk是控制点位置,ωk是控制点Pk的权因子,其值越大,曲线越靠近控制点Pk。
有理B样条有两大优点:
- 提供了二次曲面的精确表达式,如圆、椭圆等,非有理样条只能逼近二次曲面,这样使用一个表达式��有理样条就可以模拟所有曲线形状了。
- 有理样条相对透视观察变换是不变的,而非有理样条是可变的。
齐次坐标表达式用于有理样条,这是因为分母可以看成控制点四维表达式中的齐次因子,即,有理样条可以认为是四维非有理样条在三维空间的投影。
在OpenGL中,提供了gluNurbsSurface命令来生成非均匀有理B样条。
procedure gluNurbsSurface (nobj: GLUnurbsObj;
sknot_count: GLint; sknot: PGLfloat;
tknot_count: GLint; tknot: PGLfloat;
s_stride, t_stride: GLint;
ctlpts: PGLfloat; sorder, torder: GLint; _type: GLenum);
(s/k)knot_count是节点数,(s/k)knot指向节点向量值,ctlpts指向控制点,(s/t)stride指定使用控制点数组中的哪一块(即可以定义一个很大的数组,每次使用其中的一块),(s/k)order样条函数次数。最后_type说明生成什么坐标(可以是纹理、法向、顶点等)。
注意,前面提到的n这里没有对应参数,控制点数:
n+1=(sorder-sknot_count)* (torder-tknot_count)。 |