NURBS

**NURBS**は**Non-Uniform Rational B-Spline**（非一様有理Bスプライン）の略で、曲線や曲面を生成するためにコンピュータグラフィックスで一般的に採用される数学的モデルである。その柔軟性と正確性からモデリング用の形状にも、解析的な用途にも向いている。

## 歴史
NURBSは1950年代に船体や航空機自動車の外表面形状に使われるようなを数学的に正確に表現する必要のあったエンジニアらによって開発された。必要に応じていつでも同一の形状を完璧に再生成できる仕組みはそれ以前にはなく、曲面の表現にはデザイナーによって形作られた物理的模型を用いる以外の方法がなかった。

この開発におけるパイオニアとして、共にフランス出身のルノーのエンジニアピエール・ベジェとシトロエンの がいる。ベジエとデ・カスティリョはほとんど同時期に開発を進めており、そのことを互いに知らなかった。このモデルが一般的にコンピュータグラフィックスのユーザ間でスプライン曲線のひとつであるベジェ曲線として知られているのは、彼が自分の研究を出版したからである。いっぽうデ・カスティリョは彼の開発したパラメトリック曲面を評価するためのアルゴリズムとして知られるのみにとどまる。1960年代にNURBSはベジェ曲線を一般化したモデルであることがわかった。NURBSがその名の通り非一様有理Bスプラインであるのに対し、ベジェ曲線は一様非有理Bスプライン（uniform non-rational B-splines、ただし、一様非有理BスプラインとかUNRBSと呼ばれることはない）であるといえる。

当初はNURBSの利用は自動車メーカー内で用いられる商用のCADソフトだけに限定されていたが、その後に標準的なコンピュータグラフィックスソフトにも採用されていった。
1989年に初めてSilicon Graphicsのワークステーション上でリアルタイムでインタラクティブなNURBSのレンダリングが可能になった。1993年にはCAS Berlinというベルリン工科大学と共働関係にあった小さなスタートアップ企業がNöRBSという名のパーソナルコンピュータ上で動作するNURBSモデラを開発した。NURBSの技術は現在ではほとんどの業務用のデスクトップCGソフトに採用されている。それらのソフトのほとんどは、NURBSエンジンを専門の企業から購入している。

## 使用

NURBSはCADやCAM、CAEで一般的に用いられており、IGES、STEP、、PHIGSなど数々の世界標準に採用されている。コンピュータグラフィックスソフトやアニメーションソフトウェアパッケージにも採用されていることがある。MayaやCinema 4Dが有名である。

NURBSはコンピュータプログラムにとって都合がよいだけでなく、人間による編集にも向いている。NURBS曲線を布の縦糸と横糸に使ったものがNURBS曲面といえる。その形状は制御点(control point)により定義され、制御点を編集し移動することによって曲面形状を変化させられる。
NURBS曲面は特に、やや単純な幾何形状をコンパクトに表現するのに強みがある。俗に有機的曲面と呼ばれるキャラクタなどのモデリングにはサブディビジョンサーフェスが向いており、実際ゲーム業界やアニメーション業界ではNURBSよりもこちらのほうが普及している。サブディビジョンサーフェスは全体が柔らかい生物的なモデルには無類の強さを誇るが、数学的に尖った角のある形状はどうしても表現できないためCADでの利用はまずない。NURBSの数学的な正確性という強みとサブディビジョンサーフェスの柔らかな形状という強みを併せ持った新しいスプラインがT-スプラインである。これらはNURBSの2分の1の制御点数で柔らかな形状を表現できる。

一般的に言って、NURBS曲線やNURBS曲面の編集は極めて直観的で予想を裏切らないものである。モデリングはベジェ曲線のように要素の制御点をいじって編集することもできるし、より高度なスプラインモデリングのような階層状の制御を行うこともできる。スプラインモデリングとは、NURBS曲面の四角い「布」のうち数辺のみをNURBS曲線で定義して曲面そのものの生成はソフトに任せる方法である。こうすることで本来無数の制御点が必要になるような複雑な形状をずっと少ない制御点で表現されるスプライン数本で滑らかに表すことができる。

## 曲線・曲面の連続性

例えばモーターヨットの船体の表面をモデリングしていると仮定しよう。大抵の場合、モデルはNURBS曲面1枚では表しきれない（モーターヨットを一枚の伸縮自在の布で包むことは相当無理をすれば不可能ではないが、NURBSの性質上避けるべきである）。そのため「パッチ」と呼ばれる何枚かのNURBS曲面をつなぎあわせて継ぎ接ぎをすることになる。モーターヨットの船体を滑らかにしたい場合、継ぎ接ぎの跡は残したくない。複数のNURBS曲面を滑らかに、あたかも一枚の曲面であるかのように溶け込ませあうためには、数学的な幾何的連続性を確保しなければならない。

NURBSの特徴を活かし、高度なモデリングツールでは幾何的連続性を様々なレベルで実現することが可能である。

位置連続Positional continuity (G0): 2つの曲線・曲面が当該部分で「接続」されていることを保証する。接続しているだけなので、尖ったコーナーやエッジが生じる可能性がある。こういった接続ではハイライトは繋がっておらずトリップする。また製造過程で問題を起こすことがある。

接線連続Tangential continuity (G1): 当該部分でのベクトルが平行で、同じ方向を向いていることを保証する。この接続ではハイライトは繋がっているが滑らかでないことがある。ただネジやエンジン内部など審美的な要素の低い一般的な工業製品では十分な滑らかさである。このレベルの滑らかさを持っているサーフェスをクラスBサーフェスClass-B Surfaceと呼ぶことがある。エッジに単純な角丸（フィレット）をかけた場合、そのエッジは接線連続になる。

曲率連続Curvature continuity (G2): 接線連続G1よりさらに厳しく、当該部分でのベクトルが同じ長さであることを保証する。曲率連続なエッジに落ちるハイライトは滑らかであるため、それら2つのサーフェスはあたかもひとつであるかのように見える。そのため人目に触れやすい外面の表面はこのレベルで表現されていることが望ましい。このレベルの滑らかさを持っているサーフェスをクラスAサーフェスClass-A Surfaceと呼ぶことがある。iPhoneなどのApple製品や一般的な自動車は曲率連続のサーフェスでモデリングされている。

## 技術的な定義
**NURBS曲線**はその*次数*とウェイトの指定された複数の*制御点*のセット、そして*ノットベクトル*で構成される。前述のとおりNURBSはB-スプラインとベジエ曲線の一般化された表現だが、最大の違いは制御点がウェイトを持つことである。ウェイトを持つことを表すのが*有理rational*であるということで、NURBSはB-スプラインの有理である特別なケースである。

ベジエやNURBS曲線に含まれるパラメータ（媒介変数）を様々な値に変化させるとその曲線は2, または3次元の直交座標系上で表せる。同様にベジエやNURBS曲面に含まれるパラメータ（媒介変数）を様々な値に変化させるとその曲面は直交座標系上で表せる。
NURBS曲線／曲面は以下の点で有用である：
* アフィン変換を行っても不変である。そのため回転や移動（これらは代表的なアフィン写像である）といった変換を各制御点ごとに行えばNURBS曲線や曲面もそっくりそのまま変換される
* 自由曲面と、円錐や円柱などの幾何的で標準的な形状の両方を表せる。例えばベジエ曲面は正確な円を表せないという致命的な欠陥があるがNURBSは可能である
* あらゆる性質の表面を表現できる柔軟性。生物的な形状もサブディビジョンサーフェスなどに比べればやや難度が高いだけで可能だし、ベジエでは難しい曲率連続の曲面も作れる
* ポリゴンメッシュなどのより単純な方法に比べ、少ないメモリ消費で形状を表現できる
* 数値的に安定で正確なアルゴリズムを用いてかなり速く形状を評価できる

以下の節では2次元上のNURBS曲線に限定して記述するが、全ての記述は3次元上、またはそれ以上の次元においても適用可能であることに留意してほしい。
### 制御点
制御点は一般に曲線上の点ではなく、曲線の形状を決定するために用いられる。曲線上のとある点の位置は、その前後に配置されたいくつかの制御点の位置の重み付き線形和で表現される。制御点が曲線上の各点に与える影響は、その点と制御点の間の距離によって定義され、一般には距離が短いほど影響が大きくなる。次数dの曲線、すなわち各制御点への重みがパラメータtのd次多項式で定まる基底関数により表現される場合を考えると、パラメータ空間は各制御点によりd+1個に分割され、その区間内でのみ曲線上の点に影響を与える。これらの区間の両端では、基底関数の値は滑らかに0に近づく。この時の曲線の滑らかさは曲線の次数dにより決定される。

基底関数の一例として次数が1のものを考えると、これは三角形関数（テント関数）であり、その値は0から1へ向かって線形に上昇し、その後、1から0へ向かって線形に降下する。この場合、次数が1であることから、曲線のとある区間上の点は2つの制御点から影響を受ける。基底関数が0から1へと上昇する間に、2つの制御点のうち手前の制御点からの影響が低下していく。この結果として得られる曲線（曲面）は基底関数の連続性から、ポリライン（あるいはポリゴン）であり、連続性を持つものの、制御点が影響を与える区間の端点においては微分不可能である。なお、区間の内部の点においては、基底関数が多項式であり、基底関数により定まる重みと制御点の位置の線形和で曲線が定義される以上、曲線は十分に滑らかで無限階微分可能である。

多くのアプリケーションにおいて、上記のような制御点が特定の区間内の曲線にのみ影響を与える、すなわち基底関数の台が局所的であることが有利に働く。三次元形状のモデリングにおいては、一つの制御点を移動して形を整える際、一部の形状のみが変化して、それ以外の領域には影響を与えないためである。

とある曲線（例えばペンで紙にスケッチしたカーブ）を制御点により定義される多項式曲線により近似したい場合、理論上は制御点は多ければ多いほど近い形状を得ることができる一方で、有限個数の制御点で表せる曲線には限界がある。そのため、NURBS曲線において、個々の制御点にはウェイトというスカラー量が設定されており、これにより制御点の数を増やすことなく、より自由度の高い曲線の表現が可能となっている。NURBS曲線の一種と考えられるB-スプライン曲線等では各制御点への重みは一様に1となっているが、これを一部のみ2とすればその制御点の影響力が2倍になり、0とあれば影響力はなくなる。このような重みの非一様性（non-unifomity）の結果として各制御点にかかる重み付き線形和の係数が有理関数（rational function）で表されることがNURBS（Non-Uniform Rational B-Spline）の名前の由来である。この結果としてNURBS曲線は、主に円や楕円などの円錐曲線を数学的に厳密に表現できることに加え、通常の三次元モデリングにおいては、この他のスプライン曲線と同様に、重みを意識せずに利用することができる。

また、曲線や曲面といった形状処理以外の応用に目を向けると、制御点には一般的な次元の概念を見いだせる。通常、曲線を定義する場合には二次元座標上の点を、曲面を定義する場合には三次元座標上の点を制御点として用いるが、制御点の次元が二次元ないし三次元である必要はない。例えば一次元の制御点は画像処理におけるトーンマッピング曲線を定義などの目的で用いられている。また、ロボットアームの制御においては、アームの制御空間の次元は、アームの動きの自由度と等しくなり、一般に3より大きな値をとる。そのため、ロボットアームの制御において、より滑らかな動きを実現する目的では、より高次元の制御点により定義された高次元空間上の曲線が用いられる。このように、制御点と曲線は同一の次元を持つ空間上に定義され、ある一次元の曲線パラメータによって曲線が定義されるが、複数のパラメータの間で制御点を補間することにより、曲面やより高次元の超曲面を定義することも可能となる。

### ノットベクトル

### ノットと制御点の違い

### 次数と階数
NURBS曲線の*階数order*は、その曲線上の任意の点へ影響をおよぼす制御点の数である。*次数degree*はその曲線の項の数である。階数＝次数+1であり、曲線は次数（つまり階数−1）個の項をもつ多項式であらわされる。階数2のNURBS曲線の次数は1であり、つまりy=ax+bのような直線である。次数2のNURBS曲線の階数は3となり、2つの項で構成される*線形*多項式で表現される。そのため二次曲線と呼ばれる。同様に階数4であれば次数3, 3次関数を表す。制御点の数は階数以上である必要がある。大抵のCADではそれ以下の制御点で曲線描画が終われないか、そうでなければとりうる最高の階数に置き換えられる（例えばRhinoceros 3Dで次数5に指定して曲線を描く場合、ほんとうに次数5の曲線にしたいのならば初点と終点を含めて6点以上制御点をうてばよく、4点しか打たなかった場合は次数が3、3点しか指定しなかった場合は次数が2の曲線になる）。

定義上は階数5や階数7のものも問題ないが、実際のCADでは2,3,4,6,8（それぞれ次数が1,2,3,5,7）、特にほとんどの用途がこなせる階数4=次数3の曲線が多く用いられる。高い階数のものはより滑らかになるが、高すぎる階数は内部的に数値的問題を引き起こしやすく、しかも計算が無意味に遅くなるため実用上意味がない。

### 基底関数

NURBSの基底関数はB-スプラインの基底関数と同じものを使う（NURBSはB-スプラインの一族に属する）。ふつうN_{i,n}(u)で表される。ここでi はi番目の制御点に対応し、nは基底関数の次数である。媒介変数の依存性(u)はしばしば問題にならないためN_{i,n}と表されることが多い。

次数n=0の関数N_{i,0}は定数関数となる。対応するノットの範囲で1であり、それ以外のノットでは0になる。
同様に考えていくと、N_{i,n}はN_{i,n-1}とN_{i+1,n-1}の線形近似である。

### NURBS曲線の一般式
前節で説明した基底関数N_{i,n}を用いて、NURBS曲線Cは一般に次のような式で表すことができる。

: C(u) = \sum_{i=1}^{k} {\frac
{N_{i,n}w_i}
{\sum_{j=1}^k N_{j,n}w_j}}
\bold{P}_i = \frac
{\sum_{i=1}^k {N_{i,n}w_i \bold{P}_i}}
{\sum_{i=1}^k {N_{i,n}w_i}}


ここで、 kは制御点の個数。制御点\bold{P}_iはウェイトw_iを持つ。分母は正規化係数であり、全てのウェイトが1である場合1になる。この式は通例次のように記述される：
: C(u)=\sum_{i=1}^k R_{i,n}(u)\bold{P}_i

ここで関数R_{i,n}(u)

: R_{i,n}(u) = {N_{i,n}(u)w_i \over \sum_{j=1}^k N_{j,n}(u)w_j}

は*有理基底関数*と呼ばれる。
### NURBS曲面の一般式
NURBS曲面はNURBS曲線のテンソル積で得られる。2つの独立媒介変数uとv で表される。(それぞれiと jに対応する):
: S(u,v) = \sum_{i=1}^k \sum_{j=1}^l R_{i,j}(u,v) \bold{P}_{i,j} 

またこの場合有理基底関数は

: R_{i,j}(u,v) = \frac {N_{i,n}(u) N_{j,m}(v) w_{i,j}} {\sum_{p=1}^k \sum_{q=1}^l N_{p,n}(u) N_{q,m}(v) w_{p,q}}

となる。

## NURBSオブジェクトの変形

NURBSオブジェクトには様々な変形をほどこすことができる。例えばある曲線が次数dでありn個の制御点で表されているとしよう。全く同じ曲線が次数dでありn+1個の制御点で表すことができる。ただそのためには複数の制御点の位置が変更され、またノットがひとつノットベクトルに追加されることになる。

こういった変形はデザインの過程で様々な方法で用いられている。以下に変形の例を示す。

### ノットの追加
**ノットの追加**は文字通りノットをノットベクトルに追加する変形。曲線の次数がdであるとき、d-1個の制御点が新しいd個の制御点で置き換えられる。ノットの追加は曲線の形状自体は変更しないが、制御点は移動する。ノットは複数回追加できる。

### 曲率
微分幾何学において最も重要なのは曲率\kappaである。曲率はその曲線のエッジやコーナーなど局部的な様子を示すのに最適である。1次と2次の導関数の関係性を示すものでもあるため、曲線の形状を正確に知るためにも有用である。一度導関数がわかれば簡単な計算で曲線全体の曲率がわかる。

\kappa=\frac{|r'(t)|^3}
または近似式で2次導関数の弧長で計算することもできる：
\kappa=|r*(s_o)|</math>.
このような曲率の直接的な計算ができることは、[[ポリゴンメッシュ|ポリゴンによる表現]]に対するNURBSのような媒介変数曲線の大きな強みである。

==脚注==

<references />

== 参考文献 ==


* 
* Thomas Sederberg (Semester 2011) *NURBS*, , BYU, Syllabus Builder.
* 
*  Good elementary book for NURBS and related issues.
* 
* Gerald E. Farin:「NURBS 射影幾何学から実務まで（第2版）」、共立出版、ISBN 978-4-320-01679-8（2001年8月10日）.
** Gerald Farin: *NURBS FOR CURVES AND SURFACE DESIGN'', SIAM, ISBN 0-89871286-6 (1991).

## 関連項目
* PlayStation Portable

## 外部リンク
* Clear explanation of NURBS for non-experts
* Interactive NURBS demo
* About Nonuniform Rational B-Splines - NURBS
* An Interactive Introduction to Splines
* http://www.cs.bris.ac.uk/Teaching/Resources/COMS30115/all.pdf
* http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/AV0405/DONAVANIK/bezier.html
* http://mathcs.holycross.edu/~croyden/csci343/notes.html (Lecture 33: Bézier Curves, Splines)
* http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/notes.html
* A free software package for handling NURBS curves, surfaces and volumes in Octave and Matlab