非均匀有理B样条

<image>

NURBS是非均匀有理B样条曲线（non-uniform rational B-spline）的缩写，NURBS由Versprille在其博士学位论文中提出，1991年，国际标准化组织（ISO）颁布的工业产品数据交换标准STEP中，把NURBS作为定义工业产品几何形状的唯一数学方法。1992年，国际标准化组织又将NURBS纳入到规定独立于设备的交互图形编程接口的国际标准PHIGS（程序员层次交互图形系统）中，作为PHIGS Plus的扩充部分。Bezier、有理Bezier、均匀B样条和非均匀B样条都被统一到NURBS中。

非均匀有理样条（non-uniform rational B-spline，NURBS），是在计算机图形学中常用的数学模型，用于产生和表示曲线及曲面。它为处理解析函数和模型形状提供了极大的灵活性和精确性。NURBS通常在计算机辅助设计（CAD），制造 （CAM），及工程 （CAE）中有广泛应用。是众多行业宽泛标准中的一部分，如IGES, STEP, ACIS和PHIGS。同时在很多不同的3D建模和动画软件中也能找到NURBS的工具集。

通过计算机程序，他们可以很有效率的被处理，还允许进行简单的人机交互。NURBS 曲面是映射到三维的空间中的曲面的两个参数的函数。由控制点确定曲面的形状。NURBS 曲面可以用紧凑的形式表示简单的几何形状。T-样条和细分曲面更适合于复杂的有机形状，因为和 NURBS 曲面相比，它们减少了控制点数目。

一般情况下，编辑 NURBS 曲线和曲面有高度直观性和可预测性。控制点要么和曲线或曲面直接相连，要么表现的如同他们通过一根橡皮筋而相连。根据用户界面的类型，可以通过元素的控制点实现编辑，最明显常见的例子是贝塞尔曲线。

## 历史

在计算机处理之前，设计一般是通过在纸上的手绘完成，该过程需要借助许多绘画工具。例如直尺用于绘制直线，圆规用于绘制圆形，量角器用于绘制角度。但是许多不规则形状的曲线，例如船艏，是无法通过这些工具绘制的。虽然可以通过在手绘板上徒手完成，但由于尺寸原因这种手稿无法在实际生产中得到应用。1946年，数学家开始研究样条形状，该形状通过分段的多项式公式推导出来，因为其和机械生产中的样条相类似，I. J. Schoenberg将其命名为样条曲线或样条函数。NURBS的发展始于1950年代，它是由需要像在车体和船壳中使用的自由曲面的数学上的精确表示的工程师们所发现的，它可以在任何技术上需要的时候精确的复制出来。以前这类曲面的表示只存在于设计者创建的实体模型。

该发展的先驱包括：皮埃尔·贝塞尔（Pierre Bézier）和保尔·德·卡斯特里奥两个法国人，前者曾是雷诺的工程师，后者在雪铁龙工作。贝塞尔基本是和德·卡斯特里奥独立发展的，两人互相不知道对方的工作。但是因为贝塞尔发表了他的工作的结果，今天的一般的计算机图形学用户认为样条 -- 通过在曲线上的控制点表示的那类 - 为贝塞尔样条，而德·卡斯特里奥的名字仅作为他为计算参数化曲面所设计的算法而为人所知。在1960年代，人们认识到非均匀有理B样条是贝塞尔曲线的一个推广，而贝塞尔曲线可以视为均匀有理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是non-uniform rational B-spline的缩写，是非均匀有理B样条的意思。具体解释是：

non-uniform（非均匀性）：是指一个控制顶点的影响力的范围能够改变。当创建一个不规则曲面的时候这一点非常有用。同样，统一的曲线和曲面在透视投影下也不是无变化的，对于交互的3D建模来说这是一个严重的缺陷。

rational（有理）：是指每个NURBS物体都可以用有理多项式形式表达式来定义。

B-spline（B样条）：是指用路线来构建一条曲线，在一个或更多的点之间以内插值替换的。

简单地说，NURBS就是专门做曲面物体的一种造型方法。NURBS造型总是由曲线和曲面来定义的，所以要在NURBS表面里生成一条有棱角的边是很困难的。就是因为这一特点，我们可以用它做出各种复杂的曲面造型和表现特殊的效果，如人的皮肤，面貌或流线型的跑车等。

## 连续性

考虑在建造中的曲面。例如马达游艇的船体，其表面通常由一些 NURBS 曲面构成。这些曲面能够被装配在一起使得它的边界线不可见，这是几何连续性的数学表达。通过研究NURBS的特性，能够得到一些高级的工具来创建一个不同层次的几何连续性条件：

位置连续性认为只要两条曲线或曲面的结束位置相吻合。曲线或曲面可能在某个角度上相吻合，形成一个尖利的拐角或边缘。

相切连续性要求曲线或曲面的结束矢量相平行或指向同样的方向，排除了锋利的边缘。因为焦点落在切线连续的边缘总是连续的，看起来很自然，这种程度的连续性通常被认为是充足的。

曲率连续性 进一步要求结束向量具有相同的长度和长度变化率。亮点落在曲率连续的边缘不会显示任何的变化，使得两个曲面显示如同一个曲面。这可以直观地认识为非常"光滑"。这一级别的连续性在创建需要许多双立方曲面构成的模型中非常有用。

几何连续性条件主要是指形状的表面；因为 NURBS 曲面是函数，也有可能讨论其参数导数的曲面，这就是所谓的参数连续性。一定程度的参数连续性意味着在那种程度上的几何连续性。

第一和第二级的参数连续性是为位置和相切的连续性相同的实用目的设置。然而三级参数连续性不同于曲率连续性，其参数也是连续的。在实践中，如果使用均匀 B 样条三级参数连续性更容易实现。

n级连续性的定义要求某点邻域内的n阶导数在那点相等。注意曲线或曲面的偏导数是有方向和数值的矢量，这两者都应该彼此相等。高光和反射可以揭示完美的平滑，除了G²连续性的NURBS曲面没有其他方法可以在实际中做到。

连续性和度数是有关系的。一个度数为3的等式能产生C2连续性曲线。NURBS造型通常不需要这么高度数的曲线。

一条不同片断的NURBS曲线可以用不同级别的连续性。具体来说，在同样的位置或非常靠近的地方放置一些可控点，会降低连续性的级别。两个重叠的可控点会使曲率变尖锐。三个重叠的可控点会在曲线里建立一个有角度的尖角。附加一个或两个可控点会在曲线的附近联合它们的影响力。

从可控点中删除一个离开它们，就增加了曲线的连续性的级别。在3DMAX里，fuse（熔化）可控点会在曲线里建立一个假象的曲率或尖角。如果要恢复原状，unfuse（反熔化）那个点就可以了。

## 技术细节

<image>

一条NURBS曲线用一个带比重控制点和曲线的次序以及一个节点向量的集合定义。NURBS是B样条和贝塞尔曲线和曲面两者的推广，其主要差别在于控制点的比重，这使它们成为有理的（非有理B样条是有理B样条的特殊情形）。

NURBS曲线在一个参数方向上演变，通常内部用's'参数代表，而NURBS曲面在两个参数方向上演变。

所以，通过计算NURBS曲线的s-参数，它可以在三维空间中表示，通过计算NURBS曲面的s和t它也可以在三维空间中表示。

推广意味着：一条贝兹曲线总是一条NURBS曲线，就像狗总是动物。反过来则不总是成立，一条NURBS曲线可以是一条贝兹曲线，就像一个动物可以是一条狗。

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

- 在仿射变换下不变也在投影变换下不变。
- 提供了标准解析形体（例如圆锥曲面）和自由曲面两者的共同数学形式。
- 提供了设计一大类形体的灵活性。
- 减少了存储形体的内存消耗（和更简单的方法相比）。
- 可以用数值上稳定和精确的算法较快的计算。
- 是非有理B样条和非有理和有理贝兹曲线和曲面的推广。

### 控制点

<image>

节点向量是一个参数值的序列，用于决定控制点在何处和如何影响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平面上的均匀的圆的控制点，第四个参数是比重：

```tcl
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);
```

## 产生方法

AutoCAD用 SPLINE 命令创建样条曲线即 NURBS 曲线。还提供用 PEDIT 命令，平滑多段线（POLYLINE）拟合生成近似样条曲线，以下称为“样条拟合多段线”。这种曲线不是真正意义上的样条曲线，而是由若干直线（曲线）段构成的多段线，逼近于样条曲线。但使用 SPLINE 命令可把这种二维和三维样条拟合多段线转换为样条曲线。

用SPLINE命令创建的样条曲线和编辑平滑多段线生成的样条拟合多段线相比，有以下不同：

样条曲线显然要比样条拟合多段线精确的多。在工程应用中，样条拟合多段线不能作为数学分析的基础，不能在曲线上，生成切线、法线或提取曲线上的点位数据。

## 参考资料

- The main reference for Bézier, B-Spline and NURBS; chapters on mathematical representation and construction of curves and surfaces, interpolation, shape modification, programming concepts.
- Dr. Thomas Sederberg, BYU NURBS, http://cagd.cs.byu.edu/~557/text/ch5.pdf
- Dr. Lyle Ramshaw. Blossoming: A connect-the-dots approach to splines, Research Report 19, Compaq Systems Research Center, Palo Alto, CA, June 1987.

## 外部链接

- About Nonuniform Rational B-Splines - NURBS
- TSplines is a Superset of NURBS
- NURBS with 3ds max tutorials (en)
- An Interactive Introduction to Splines