NURBS简介
作者:品雪 pinxue@hotmail.com 1999.7.
RedBook及国内出的精通、入门等等书都绕过了对NURBS的详细介绍,其实它并没有那么复杂,尤其是对于使用者来说。
啥是NURBS呢?
NURBS= non uniform rational B-spline,非均匀有理B样条。
想象一块绷紧的薄橡皮,当用一个手指按在表面时,会凹下一个洞,如果用两个的手指按上去,就会出现两个洞,并且两个手指会互相影响,任何一个移动都会使两个洞周围的形状改变。如果我们有足够多的手指从正反两面压上去,就可以把这块橡皮摆弄成任何形状。这正是B样条曲面造型的原理,也是其样条一词的含义:样条=可摆弄成所需样子的橡皮条。(未经考证J )
B样条曲面(或面片patches)由两个参数变量描述(如s和t),变量值从0取到1。可以通过将这两个参数的当前值代入一个公式,计算出曲面上每个点的xyz空间坐标。
控制点是在xyz空间的点,你可以把它看成牵线的手指,这些线拴在曲面上。当一个手指移动时会拉动一根线,下面的参数化曲面形状就会相应改变。这种控制点运动在一定距离内起作用,这意味着一个曲面上的点可能同时(通常就是)受控于多个手指(控制点)。样条技术允许我们描述表面上的一个点是怎样被影响的它所有控制点的运动影响的。它是通过为每个顶点累加每个控制点对它产生的影响来实现的。离点越近的控制点影响作用越大。总会有一个界限,超出后控制点不再影响表面点。因此,每个手指在参数通过它(drift away from it)之后失去影响,另一个手指取而代之。
记住在任意一点有多于一个手指产生影响(除了bezier的端点)。节点就象一种边界,在这个边界上一个手指失去影响作用,另一个手指取得影响。因此sknots和tknots是这种变换的数目。(不完全对但很接近),map2vertex是OpenGL中取得绘制曲面必要信息的方法。
因为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样条性质:
非均匀样条:节点向量的值与间距可以为任意值值。这样我们可以在不同区间上得到不同的混合函数形状,为自由控制曲线形状提供了更大自由。
关于节点向量值:均匀与非均匀的主要区别在于节点向量的值。如果适当设定节点向量,可以生成一种开放均匀样条,它是均匀与非均匀的交叉部分。开放样条在两端的节点值会重复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)。