非均匀有理B样条

**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（反熔化）那個點就可以了。

## 技術細節

一條 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);
```

## 產生方法

AutoCAD 用 SPLINE 命令建立雲規曲線即 NURBS 曲線。還提供用 PEDIT 命令，平滑多段線（POLYLINE）擬合生成近似雲規曲線，以下稱為「雲規擬合多段線」。這種曲線不是真正意義上的雲規曲線，而是由若干直線（曲線）段構成的多段線，逼近於雲規曲線。但使用 SPLINE 命令可把這種二維和三維雲規擬合多段線轉換為雲規曲線。
用 SPLINE 命令建立的雲規曲線和編輯平滑多段線生成的雲規擬合多段線相比，有以下不同：
雲規曲線顯然要比雲規擬合多段線精確的多。在工程應用中，雲規擬合多段線不能作為數學分析的基礎，不能在曲線上，生成切線、法線或提取曲線上的點位資料。

## 參見

* B 雲規

## 參考資料

* Piegl, Les; Tiller, Wayne. The NURBS Book 2nd ed. Springer-Verlag. 1995–1997.  引文格式 1 維護：冗餘文字 (link) 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