ビギナーのための曲面モデリングセミナー(第2回)

ビギナーのための曲面モデリングセミナーTop | 予告編 | 第1回 | 第2回 | 第3回 | 第4回 | 第5回 ]

第2回 NURBS曲線・曲面モデリングセミナー|なんで制御点があるの?ノットってなあに?

源氏物語から木星探査機ボイジャーまで

やっとNURBSの話になります。NURBSをどう読むかは定まってないようです。筆者は「ナーブス」と呼んでおります。
「ナーバス」と呼ぶ方もおられます。これはNURBSとは何ぞやと解りそうで解らない(いらいら)状態(nervous)そのものですね。(座布団1枚!)

NURBSは次の曲線・曲面表現の頭文字を集めたものです。
Non Uniform Rational B-Spline
(ノン ユニフォーム ラショナル Bスプライン)

末尾にBスプラインとあるようにNURBSはBスプライン(曲線・曲面)の仲間です。

NURBSは、かなり好き勝手が許されるBスプラインで、好き勝手の内容がノンユニフォームでラショナルだというものです。

今回は、「ノンユニフォーム」で「ラショナル」な「Bスプライン(曲線・曲面)」について説明していきます。
源氏物語や惑星探査機ボイジャーがイメージできるとNURBSは理解しやすいはず!?

NURBSを記述する4つのキーワード

NURBS(以後、特に断らない限りNURBS「曲線」を指すことにします)は4つの要素から構成記述されます。イメージ(これが大切!)は次節以降で説明します。

1. 階数(次数)
NURBSは、Bスプライン曲線の仲間で、Bスプライン曲線は3次元空間に描かれたn次式のグラフなのです。(第1回セミナー:パラメトリック曲線参照) n次式というように「次数」を持ちます。次数と同じ概念ですが「階数」ということもあります。階数は次数に1を加えた値になります。筆者はもっぱら階数を用いております。

2. 制御点数
NURBSは曲線の概形を表す折線を必要とします。「折線」とは順序付けられた複数の点(点列)です。折線は、階数(次数+1)個以上の点で構成されています。

3. 制御点列(折線)
折線を構成する個々の点の「位置」です。座標(x,y,z)とウェイトwを持ちます。

4. ノットベクトル
複数の数値を1列にならべたものです。数値は、同じかだんだん大きな値になるよう並べます。

ここでいうベクトルとは「複数の独立した数値の組」のことです。ベクトルというと矢印を連想しますが、矢印は[x、y、z]という3つの独立した数値の「組」をたまたま3次元空間と関連させたものです。パラメトリック曲線の高速道路の例を思い出して下さい。ノットベクトルに並んだ数値は、各インターの通過時刻に相当します。

多くのモデリングシステムでは、たとえNURBSベースのモデラーであっても、これら要素を直接ユーザに示すことはありません。通過点(ライノセラスでは「編集点」)を与えるとシステムが、これら4つの要素を適当に(ちゃんと計算して)決定します。

ライノセラスでは、これら4つの要素をユーザが直接操作することができます。デザイナーが表現したい微妙なカーブを(懸命に操作すれば...)作成することができます。ただし、NURBSとして許される表現は、必ずしもCAD・CAM・CAEモデルとして許されるものではありません。ライノセラスは、これら4つの要素の直接操作を許し、ユーザに微妙なデザインのチャンスを与えています。その代わり、後工程で利用できない無茶なモデルを作ってしまう可能性も与えています。

パラメトリック曲線・曲面のおさらい

パラメータ(t)に対して点(x,y,z)が対応づけされているとき、tをある範囲で無限に細かく変化させると点の帯ができます。これを「パラメトリック曲線」と呼びます。同様に1組のパラメータ(u,v)に対して点(x,y,z)が対応する時、u、vをそれぞれ独立に無限に細かく変化させると点の広がりができます。これを「パラメトリック曲面」と呼びます。

パラメータ(t)や(u,v)から点(x,y,z)を対応づける方法はいくつか考案されています。「Bスプライン基底関数」を利用するとBスプライン曲線・曲面となります。「バーンシュタイン基底関数」を利用するとBEZIER曲線・曲面になります。

ノットの話(その1):セグメント、パッチ

多くのモデラーで採用されている曲線や曲面は、実は小さな曲線単位や曲面単位の集合です。この小さな曲線単位を「セグメント」、小さな曲面単位を「パッチ」と呼びます。セグメントは1列に、パッチは縦横格子状に並びます。曲線・曲面全体を見渡して、どの辺りでセグメントやパッチに分かれているか境界を表すのが「ノットベクトル」です。ライノセラスの「インサートノット*1」は、セグメントやパッチを細分割することに相当します。(細分割しない挿入もあり*2

曲線・曲面は、全体を通して「滑らか」であることが求められます。当然、セグメントとセグメントのつなぎ目、パッチとパッチのつなぎ目は、隙間や折れがあってはいけません。(これは大変重要なことなのです。)

※1 インサートノット
Bスプラインでは、ノットとノットの間にセグメントがあるともみなせます。ノット間に新しいノットを挿入すれば、2つの小さなセグメントになります。
※2 セグメントを分割しないインサートノット
既にあるノットと同じ位置にノットを挿入することができます。この操作を「ノットを重ねる」といい、ノットの状態を「多重ノット」と呼びます。多重ノット両サイドのセグメントは、セグメントのつなぎ目で滑らかさが保証されなくなります。この性質を利用してノットを次数個重ねると曲線をそこで折ることができます。ライノセラスの「インサートキンク」は、この操作をしています。ただし、3次元CADで用いる(1本の)曲線は、途中で折れることはタブーですので、注意が必要です。

階数(次数)の話:硬いセグメントと柔らかいセグメント

セグメントには、硬さがあります。ちょうど針金みたいなものです。硬い針金ですと簡単には曲げることができません。柔らかい針金ですとすぐにぐにゃぐにゃになってしまいます。

「階数」とはセグメントの「硬さ」を決める指標です。階数が高いほど柔らかいセグメントになります。最も硬いセグメントの階数は2(次数は1)で、その形状は直線しかありません。次の硬さは階数3(次数2)でセグメントの途中で(必要なら)1回だけ曲げることができます。階数4(次数3)では2回まで曲げることができます。

2次関数や3次関数のグラフがU字型やN字型になることからも類推できます。

全体としてぐにゃぐにゃした1本の曲線を表すには2つの選択があります。

選択1:セグメント1個で曲線を表す。セグメントは階数を高くして柔らかくする。
選択2:セグメント数個で曲線を表す。セグメントは階数を低くして硬くする。

「Bスプライン曲線」は(もちろん「NURBS」も!)選択2のために考案された曲線です。セグメントとセグメントのつなぎ目で、隙間ができたり折れたり、あるいは曲線としての丸みの度合い(曲率)が変化することがない様に曲線全体を決定することができます。
ちなみに選択1を目指したのが「BEZIER曲線」です。

階数(次数)を上げると、セグメントが柔らかくなり過ぎて、そうなって欲しくないところでぐにゃぐにゃが現れます。(これを曲線の振動と呼びます)振動を避けるためにはなるべく低い階数を選んだ方が有利です。しかし、曲線全体を表すために複数のセグメントが必要です。

曲面のパッチについても同様です。

階数(次数)の話:硬いセグメントと柔らかいセグメント

制御点は、Bスプライン曲線の大体の形を決めます。先のセグメントという曲線単位に注目すれば、各セグメントは階数と同じ個数の点でできた折線を参照します。

4階(3次)のBスプライン曲線を考えます。セグメントは1個とします。このとき必要な制御点は4個です。折線によく似た形のセグメントが得られます。次に2個のセグメントからなるBスプライン曲線では、制御点は1個増えて5個になります。3個のセグメントからなるBスプライン曲線では6個の制御点を必要とします。各セグメントは、その形を決定するために階数個の制御点を参照しますが、隣接するセグメントでは、参照する制御点を(階数-1)個オーバーラップさせています。

セグメント ♯0 参照制御点 Q0-Q1-Q2-Q3
セグメント ♯1 参照制御点 Q1-Q2-Q3-Q4
セグメント ♯2 参照制御点 Q2-Q3-Q4-Q5

「階数」と「制御点数」が与えられると、Bスプライン曲線がいくつのセグメントから構成されているか計算できますね!

Bスプライン曲線の話:曲線の形状決定

制御点から曲線形状を決めるイメージを紹介します。源氏物語の主人公、源氏の君にご登場願います。光源氏は、成長とともに多くの女性と熱い関係になった方であります。成長を時の経過とみなし、周囲の女性との親密度を刻々と表してみます。物心ついた時にはAさん(藤壷)に夢中で他の女性には目もくれませんでした。ところがだんだんとBさん(紫の上)、Cさん(朧月夜)への関心が強まりA子さんのことは徐々に忘れていきました。同様にDさん(六条御息所)、Eさん(夕顔)に関心をいただき始めるとともにBさんCさんのことも忘れていきました。そして今度はFさん(玉鬘)に...

時の経過をパラメータ(t)、想いをよせた女性のいる場所を制御点Qn、親密度のバランスから源氏の置かれた位置を(x,y,z)とすれば、なんと源氏の残した軌跡がBスプライン曲線になります。

Bスプライン基底関数の話:時間とともに変わる魅力の係数

数学の世界では、(源氏の身勝手な振る舞いを無視して)源氏の置かれた位置を決めたのは、周囲の女性のせいだと考えます。源氏に対する魅力が、時の経過とともに徐々に高まり、ピークを過ぎてまた徐々に低くなると考えます。この魅力の経年変化を表すのが「Bスプライン基底関数:Nx(t):横軸(時間)、縦軸(魅力)」で、すべての女性(制御点)に与えられます。それぞれの女性の魅力がピークを迎える時期は、制御点並びの順に少しづつずれています。源氏は、周囲の女性すべての魅力に対し、その瞬間にバランスする位置に立っています。

ノットベクトルの話(その2):いつ頃が魅力のピークかしら

ノットベクトルの本当の解釈は、魅力の変化を決定する指標です。時間の経過とともに魅力が高まり、いずれその魅力が衰える様を決定します。「いつ」そうなるかを表す、まさに人生の節目(ノット)なのです。

魅力、つまりBスプライン基底関数の値はゼロかプラスを取ります。プラスの状態にあるということは、源氏に何かしら影響を与えています。魅力的な状態(期間)は、ノットベクトル中、階数(次数+1)と同じ区間だけあります。(下図は4階だから4期は魅力的)

ということで、ノットベクトルは(制御点毎の)Bスプライン基底関数を決定するためにあることがお分かりいただけたでしょうか?

ノットの数は、階数(魅力的な期間)と制御点数(恋人の総数)が決まれば一意に決まります。一般に、「ノット数」は、「階数(次数+1)」と「制御点数」の和になります。ライノセラス内部のノット数は、上記の値より2個少ない記述となっています。(計算に影響ないので両端の2個のノットを保存していません。)

それからもう一つ!(上のグラフでは)源氏の軌跡(Bスプライン曲線)は、t3からt6までの期間のみ意味を持ちます。はみ出しているt0からt3やt6からt9は、曲線を定義するパラメータにはなりません。この辺がBスプライン曲線とノットベクトルの関係をややこしくしてしまうところです。源氏の歩み(セグメント)は例えば、t3からt4、t4からt5という区間に定義されます。常に4人(階数分)の姫(制御点)の魅力を受けるとすれば、こうなるわけですね。

ウェイトの話:魅力を高めるもう1つの要因

ウェイトを体重と解釈されては登場の姫君に失礼なので、ここでは制御点を惑星、魅力を引力に喩えることにします。ボイジャーのような惑星間を航行する探査機は、それぞれの惑星からの引力がバランスする位置を通過して行きます。ものすごく重い星では探査機に作用する引力も大きくなります。制御点に重さ「ウェイト」を与えることができると、探査機は、その制御点のすぐ横を通過していきます。Bスプライン曲線の制御点では、個々の制御点のウェイトの絶対値には意味がありません。制御点間の相対的なウェイトの比率が効いてきます。*3

※3 ライノセラスのウェイトコマンド ライノセラスでは、特定の制御点のウェイトを指定できます。制御点にはデフォルトで同じ値が設定されているはずです。このバランス比率を崩すのがウェイトコマンドです。

ノンユニフォームでラショナルとは?

やっとNURBSというちょっと特殊なBスプライン曲線をまとめるところまで来ました。

まず「ノンユニフォーム(NonUniform)」について。直訳すれば「均一でない」ということです。何が均一でないのでしょうか?答えは「ノットの間隔」です。ノットベクトルは(制御点毎の)Bスプライン基底関数の有効期間を表すともいえます。ノットの間隔を自由に調整することにより、特定のある女性が、長い間源氏の関心を集めておくことができます。ノット間隔が均一だと、(時期が来れば)皆同じパターンで愛されることになります。

「ラショナル(Rational)」の直訳は「有理である」ことです。有理とは、分数で表すことができる値ということです。結論は「制御点毎にウェイトが指定できる」ことと同等です。ウェイトの効果を反映させるのに、計算中分数が現れます。

制御点Qj、ウェイトwj、Bスプライン基底関数Nj(t)を用いて次のような計算をすると(t)からP(x、y、z)が求まります。

NURBS曲面は曲線から類推

NURBS曲面を構成する要素は、曲線の場合とよく似ています。

1. 階数:u方向、v方向独立に指定します。
2. 制御点数:u方向に見た制御点数、v方向に見た制御点数を指定します。
3. 制御点:格子状に与えます。座標(x,y,z)とウェイトwを持ちます。
4. ノットベクトル:u方向、v方向独立に指定します。

こんなNURBSは作っちゃだめ!
ライノセラスは、NURBSの構成要素を直接操作することができます。それだけに、ユーザが無茶な操作を行ってしまうと、作成された曲線や曲面は、ライノセラス以外のシステムでは受け入れられないことになりかねません。

1. 制御点を重ねているもの
制御点が作る折線やメッシュは決して自己交差してはいけません。隣接する制御点が重なるのもいけません。縮退辺を持つ曲面は、縮退辺では完全に制御点を重ねるケースのみOK。

2. 制御点間隔が(極端に)不均一なもの
多くの曲線、曲面に関する計算(最近点、交差、折線近似、三角形近似)では、計算の当たりを付けるために制御点が作る折線やメッシュを参照します。当たりを付け損ねることがあります。

3. ノット間隔が(極端に)不均一なもの
ノット間隔は、パラメータ空間でのセグメントやパッチの大きさの指標になります。あまりに不均一ですと計算の当たりを付ける処理で失敗する(誤る)ことがあります。

4. ノット間隔がセグメント・パッチサイズに比例しないもの
パラメトリック曲線・曲面の宿命ともいえる問題です。曲線では、セグメントのxyz空間での大きさとパラメータ空間での大きさ(ノットの間隔)がほぼ比例しているのが望ましい姿です。曲面では、パッチの大きさについてxyz空間のサイズとuv空間のサイズが(ほぼ)比例しているのが理想的です。

5. 多重ノットの乱用
ノットベクトルについて隣接するノットの間隔ゼロ(つまり同じ値を続けること)が許されます。ほとんどのNURBSを利用できるモデラーでは、両端のノットだけは階数分(ライノは次数分)重ねます。(こうすると曲線の両端が制御点と一致します。)特別なインサートノットとして中間部のノットを重ねると、セグメント(パッチ)のつなぎ目の滑らかさが保証されなくなります。

6. 負のウェイト
Bスプライン曲線・曲面の重要な性質として、表現された曲線や曲面が必ず制御点折線・メッシュからはみ出さないことがあります。負のウェイトを与えると、制御点の引力が反発力になってしまいこの性質がくずれます。ウェイトは円弧や楕円(円錐曲線の仲間)を誤差なくBスプライン曲線で表すためだけに導入されたと考えるのが実用的です。

例によって感想質問の連絡先

このセミナーのページで掲載した概念、文章、挿し絵など一切の責任は、筆者にあります。
質問、意見は筆者まで。決してアプリクラフト社へはねじ込まないでください。

株式会社エムシースクウェアド 代表 大野敏則
TEL:053-450-7266 FAX:053-450-7288
info@mc-squared.co.jp

【参考文献】
・Rhinoceros バージョン1.0 ユーザーガイド 28章
The NURBS Book
 Les Piegl、Wayne Tiller、Springer、ISBN3-540-55069-0
CAD/CG技術者のためのNURBS早わかり
  三浦、中嶋、大野著、工業調査会、ISBN4-7693-5082-1
  (1冊売れると私に印税XX円がはいります...)
CAD/CAMにおける曲線曲面モデリング
  穂坂 衛、東京電気大学出版局、ISBN4-501-52250-X
コンピュータディスプレイによる形状処理工学 Ⅰ
  山口富士夫、日刊工業新聞社、ISBN4-526-01434-6

ビギナーのための曲面モデリングセミナーTop | 予告編 | 第1回 | 第2回 | 第3回 | 第4回 | 第5回 ]