NURBS简介

 非均匀有理样条(NURBS)(non uniform rational B-spline),是在计算机图形学中常用的数学模型,用于产生和表示曲线及曲面。

 NURBS的发展始于1950年代,它是由需要像在车体和船壳中使用的自由曲面的数学上的精确表示的工程师们所发现的,它可以在任何技术上需要的时候精确的复制出来。以前这类曲面的表示只存在于设计者创建的实体模型。该发展的先驱包括:皮埃尔·贝兹(Pierre Bézier), 他曾是Renault的工程师,以及Paul de Casteljau,他在Peugeot工作,两个都是法国的。贝兹基本是和de Casteljau独立发展的,两人互相不知道对方的工作。但是因为贝兹发表了他的工作的结果,今天的一般的计算机图形学用户认为样条 – 通过在曲线上的控制点表示的那类 - 为贝兹样条,而de Casteljau的名字仅作为他为计算参数化曲面所设计的算法而为人所知。在1960年代,人们认识到非均匀有理基本样条是贝兹曲线的一个推广,而贝兹曲线可以视为均匀非有理B样条。

最初NURBS仅用于汽车公司私有的计算机辅助设计包。后来它们成为标准计算机图形包的一部分,包括OpenGL图形库。

NURBS曲线和曲面的实时、交互绘制最初由Silicon Graphics工作站于1989年提供。在1993年,CAS Berlin(一个和柏林工大合作的小创业公司)开发了第一个个人机上的交互式NURBS建模器,称为NöRBS。今天多数台式机上的专业计算机图形应用程序提供NURBS技术,一般通过集成一个从专用公司来的NURBS引擎。

NURBS对于计算机辅助设计、制造和工程(CAD,CAM,CAE)是几乎无法回避的,并且是很多业界广泛采用的标准的一部分,例如IGES, STEP,和PHIGS。

但还是有很多它们在交互式建模中的优点和有用性的错误观念,主要是由于关于单一软件包及其用户界面的易用性而得出的猜测。 通常,据说编辑NURBS曲线和曲面是高度直观和可预测的。控制点总是直接连接到曲线或曲面上或象是通过一根橡皮筋连接。根据用户界面的类型,编辑可以通过它们各自的控制点实现,这对于贝兹曲线是最显然和最一般的,或者也可以通过高层的工具,例如样条建模或者层次结构的编辑。高层工具可以设计得很强大,并得益于NURBS创建和建立不同层次的连续性的能力: c0连续性表示连通性,c1连续性可以视为没有尖角,而c2连续性通常称为几何连续性,视觉上也就是“光滑”的东西,用NURBS还可以达到更高阶的连续性,它们可以导致”亮度连续性”。这被新车模型的摄影师所倚重,他们热衷于展示霓虹灯在车身上的镜像。灯光可以展示出完美的光滑度,这在没有NURBS的情况下实际上是不可能。

一条NURBS曲线用一个带比重控制点和曲线的次序以及一个节点向量的集合定义。NURBS是B-样条和贝兹曲线和曲面两者的推广,其主要差别在于控制点的比重,这使它们成为有理的(非有理B-样条是有理B-样条的特殊情形)。 NURBS曲线在一个参数方向上演变,通常内部用’s’参数代表,而NURBS曲面在两个参数方向上演变。 所以,通过计算NURBS曲线的s-参数,它可以在三维空间中表示,通过计算NURBS曲面的s和t它也可以在三维空间中表示。 推广意味着:一条贝兹曲线总是一条NURBS曲线,就像狗总是动物。反过来则不总是成立,一条NURBS曲线可以是一条贝兹曲线,就像一个动物可以是一条狗。

NURBS有用的原因有很多条:他们

在仿射变换下不变也在投影变换下不变; 提供了标准解析形体(例如圆锥曲面)和自由曲面两者的共同数学形式; 提供了设计一大类形体的灵活性; 减少了存储形体的内存消耗(和更简单的方法相比); 可以用数值上稳定和精确的算法较快的计算; 是非有理B-样条和非有理和有理贝兹曲线和曲面的推广。 节点向量是一个参数值的序列,用于决定控制点在何处和如何影响NURBS曲线。节点的个数总是等于控制点的个数加上曲线的阶数。节点必须只是用于内部计算,因而一般对于软件的终端用户来说是没有帮助的、不可编辑、甚至不可以见的。

节点向量的值必须升序:下面的向量是正确的:[0 0 1 2 3],而接下来这个不是:[0 0 2 1 3]。也要注意唯一重要的因素是值之间的比例:节点向量[0 0 1 2 3],[0 0 2 4 6]和[1 1 2 3 4]产生相同的曲线。不可以有比曲线的度数更多的重合值:节点的重复度≤度数。 对于一阶NURBS,每个节点和一个控制点结对。

曲线的序大于或等于2,对应与一条线性曲线(序=2,表示一条直线),一条二次曲线(序=3)以及一条三次曲线(序=4)。数学上曲线用同阶的多项式表示,一条三次曲线用3阶多项式表示,其序为4。另外,控制点的个数必须等于或大于曲线的序。实践上,3阶的三次类型是表示曲线和曲面时最常用的。而4次或5次的有时候有用,特别是用于导数,更高阶实际上从来不用因为他们经常导致内部数值问题并趋向于消耗更多的不必要的计算。

非有理曲线有时不够用,例如用于表示圆。 这是表示一个XY平面上的均匀的圆的控制点,第四个参数是比重:    cp_circle[0] = Controlpoint( 1、 0、0、     1);    cp_circle[1] = Controlpoint( 1、 1、0、sqrt(2) / 2.0);    cp_circle[2] = Controlpoint( 0、 1、0、     1);    cp_circle[3] = Controlpoint(-1、 1、0、sqrt(2) / 2.0);    cp_circle[4] = Controlpoint(-1、 0、0、     1);    cp_circle[5] = Controlpoint(-1、-1、0、sqrt(2) / 2.0);    cp_circle[6] = Controlpoint( 0、-1、0、     1);    cp_circle[7] = Controlpoint( 1、-1、0、sqrt(2) / 2.0);    cp_circle[8] = Controlpoint( 1、 0、0、     1);

ps:thanks for wikipedia&university of bristol.

评论突破3600…即日起暂闭清理…