非均勻有理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平面上的均勻的圓的控制點，第四個參數是比重：

```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