Bスプライン曲線・曲面
ベジェ曲線 は、制御点を増やすほど次数が上がり、1つの制御点を動かすと曲線の全体が形を変えます。次数を制御点の数から切り離し、1つの制御点が効く範囲をパラメータの一部に限ったものがBスプライン曲線です。
Bスプライン曲線
ベジェ曲線で制御点の重みを決めていたバーンスタイン基底関数 は、両端を除くすべてのパラメータで0になりません。どの制御点も曲線の全体に効き続けているため、1つだけ動かしても、形が変わるのは一部にとどまりません。
そこで、決まった範囲の外では0になる基底関数を用意し、0でない範囲を制御点ごとにずらして並べます。こうすれば、1つの制御点を動かしたときに形が変わるのは、その制御点が効いている範囲だけです。
制御点を から までの 個、次数を とすると、Bスプライン曲線上の点は次のように表されます。
番目の制御点にかかる重み がBスプライン基底関数です。制御点に重みをかけて足し合わせる組み立ては多項式曲線 と変わらず、Bスプライン曲線を分けているのは、この重みの選び方だけです。
ベジェ曲線では、制御点を 個置けば曲線は 次に決まっていました。Bスプライン曲線の次数 は制御点の数とは別に選べるため、 を3に固定したまま制御点をいくらでも増やせます。その分、曲線は1本の式では表せなくなり、区間ごとに別の多項式が現れる区分多項式曲線になります。
スプラインは、製図で滑らかな曲線を引くのに使われたしなやかな定規を指す言葉です。Bは基底(basis)の頭文字で、基底関数から組み立てる曲線であることを表しています。
ノット列
基底関数が0でない範囲を制御点ごとにずらすには、パラメータの動く範囲をどこで区切るかを先に決めておく必要があります。
この区切りにあたる値をノットといいます。ノットを小さい順に並べたものがノット列で、ノットベクトルとも呼ばれます。制御点が 個で次数が のとき、ノットは 個になります。
隣り合うノットが同じ値になってもかまわないため、等号を含めて書きます。
曲線として現れるのは、ノット列の全体ではなく から までの範囲です。両端の 個ずつのノットは、基底関数を組み立てるためだけに使われます。
ノットに挟まれた区間1つが、曲線のセグメント 1つに対応します。区間の中では曲線は 次の多項式で、区間の境目が繋ぎ目になります。曲線が現れる範囲には区間が 個並び、その数だけセグメントが繋がります。
ノット列は、どの制御点をパラメータのどこで効かせるかを決める割り振りにあたります。
Bスプライン基底関数
Bスプライン基底関数は、次数0の階段から始めて、次数を1つずつ上げながら組み立てます。
次数0の は、 の区間で1、その外では0とします。区間1つだけを受け持つ矩形で、番号の違う どうしが重なることはありません。
次数を1つ上げるときは、次数が1つ低い基底関数を隣り合う2つ取り、パラメータの1次式で混ぜ合わせます。
前の項にかかる係数は から へ向かって0から1へ増え、後の項にかかる係数は から へ向かって1から0へ減ります。この2つを足すことで、山が1つだけあり、区間の境目でも折れずに繋がる形が得られます。
0でない範囲は、次数を1つ上げるごとに1区間ずつ広がります。次数 の が0でないのは から までで、区間の数では 個です。
1つの基底関数が使うノットは から までの 個です。 が0から まで動くことから、ノット列は まで必要になります。
1つの区間の中で0でない基底関数は 個あり、その総和は1になります。値がどれも0以上であることと合わせて、曲線上の点は効いている制御点の重み付き平均として得られます。
ノットが重なっている箇所では、漸化式の分母が0になることがあります。この項は0として扱います。
Bスプライン基底関数の形を次数ごとに並べる図。等間隔のノット列に対して、次数0・1・2・3の基底関数を4段に描き、横軸のノットの位置を段の間で揃える。各段で値が0でない区間を塗り分け、次数を1つ上げるごとに0でない区間が1つずつ広がることと、山が1つだけの滑らかな形に近づいていくことが読み取れるようにする。
局所性
局所性 は、1つの制御点を動かしたときに、形が変わるのが曲線の一部にとどまる性質でした。Bスプライン曲線では、この性質が基底関数の0でない範囲からそのまま出てきます。
制御点 に重みをかけているのは だけで、これが0でないのは 個の区間です。そのため、 を動かして形が変わるのは 個のセグメントに限られ、残りのセグメントは動きません。
裏返して見ると、曲線上の1点を決めているのは 個の制御点だけです。3次であれば4個で、制御点が何百個並んでいても、1点を求めるのにかかるかけ算と足し算の回数は変わりません。
各セグメントは、そこで効いている 個の制御点の凸包に収まります。曲線の全体が制御点の全体の凸包に収まったベジェ曲線に比べ、形の見当をつけられる範囲がセグメント単位まで細かくなります。
形を直したい場所の近くの制御点だけを動かせばよいため、制御点を数多く置いたまま対話的に形を整える作業に向いています。
局所性の図。3次のBスプライン曲線に制御点を8個ほど置き、1つの制御点を動かす前と後の曲線を重ねて描く。ノットの位置を横に目盛りとして添え、形が変わったのが4つの区間だけで、残りの区間の曲線が動いていないことを示す。
繋ぎ目の連続性
ベジェ曲線を繋いで長い形をつくる場合、繋ぎ目が滑らかになるかどうかは、両側に置いた制御点の配置で決まります。条件を守らないまま制御点を並べると、繋ぎ目に折れ目が残ってしまいます。
Bスプライン曲線では、この条件が基底関数の側に移っています。繋ぎ目でどこまで滑らかに繋がるかは、基底関数がノットでどこまで滑らかかだけで決まり、制御点をどこに置いても変わりません。
漸化式では、次数を1つ上げる度にパラメータの1次式をかけて足し合わせます。この操作で微分できる回数が1つ増えるため、次数 の基底関数はノットで 階微分まで一致し、曲線のパラメトリック連続性 は 連続になります。
よく使われる3次では 連続で、曲がり具合の変わり方まで繋がります。繋ぎ目ごとに条件を確かめる作業がいらないことが、Bスプライン曲線が形状設計で広く使われている理由です。
ノットの間隔
ノットの値は、大小の順が保たれていれば自由に決められます。間隔の取り方によって、Bスプライン曲線は大きく2種類に分けられます。間隔をすべて等しくしたものが一様Bスプライン曲線、等しくしないものが非一様Bスプライン曲線です。
一様Bスプライン曲線
のように等間隔で並べると、基底関数はどれも同じ形になり、区間1つ分ずつずれた位置に置かれた平行移動の関係になります。形を1つ求めておけば、あとは番号を読み替えるだけで済むため、計算は軽くなります。
一方で、曲線は制御点を通りません。3次では、ノットにあたるパラメータでの点が、隣り合う3個の制御点を1対4対1の比で混ぜた位置になります。曲線の端も同じで、始まりの点は より内側に入ります。端の位置を制御点にぴったり合わせたい場面では、この性質が扱いにくくなります。
非一様Bスプライン曲線
間隔が変われば基底関数の形も区間ごとに変わり、制御点の効き方に強弱を付けられます。制御点が密なところと疎なところがある場合に、パラメータの進み方を制御点の間隔に合わせて割り振る使い方もあります。
ノット列は等号を含む形で書いてあるため、同じ値のノットを重ねて置けます。重ねたノットを多重ノットといい、重ねた個数(重複度)を とすると、その繋ぎ目は 連続まで下がります。滑らかさを落とす代わりに、折れ目や直線の部分を意図してつくれます。
重ねる仕組みは端点にも使えます。両端のノットを次数より1つ多い 個ずつ重ねると、曲線の端が に一致し、端での接線の向きも隣の制御点へ向かう方向に揃います。間隔が等しくないのを両端だけに限ったこの取り方を開一様ノットベクトルといい、端の位置を指定したい形状設計では既定の取り方になっています。
ノット列の取り方を比べる図。同じ制御点の並びに対して、一様なノット列と、両端を4個ずつ重ねた開一様ノット列の2通りで3次の曲線を描き、上下に並べる。それぞれのノット列を数直線として添え、開一様のほうでは曲線の両端が端の制御点に一致することを示す。
ベジェ曲線との関係
開一様ノットベクトルで、内側のノットを1つも置かない場合を考えます。制御点を 個だけ置くと、ノットは両端の 個ずつだけになり、区間は1つしか残りません。
このときのBスプライン基底関数は、バーンスタイン基底関数と一致します。
つまり、ベジェ曲線はBスプライン曲線の特別な場合です。制御点の数を次数に合わせて1つの区間に収めたものがベジェ曲線で、区間を増やして次数を据え置いたものがBスプライン曲線にあたります。
逆に、Bスプライン曲線のセグメント1つずつを、同じ形のベジェ曲線として書き直すこともできます。ベジェ曲線しか扱えない仕組みへ形を渡すときに使われます。
Bスプライン曲面
曲面への広げ方は、ベジェ曲面 のときと変わりません。制御点を1列ではなく格子状に並べ、2方向それぞれの基底関数をかけ合わせて重みにするテンソル積の形をとります。
方向の次数を 、 方向の次数を 、制御点を 個とすると、Bスプライン曲面上の点は次のように表されます。
ノット列は 方向と 方向に別々に用意します。 方向の区間と 方向の区間を1つずつ組み合わせた1枚がパッチ にあたり、曲面の全体は、パッチごとに別の多項式が現れる区分多項式曲面になります。
局所性も2方向に働きます。1つの制御点 が影響するのは 枚のパッチで、双3次なら16枚です。ノットを重ねなければパッチの境界でも 連続が保たれるため、格子の一部を動かしながら、継ぎ目の見えない面を張っていけます。
ただし、Bスプライン曲面は多項式でできているため、球や円柱のような2次曲面を正確に表すことはできません。制御点ごとの重みを加えて有理式に広げた非一様有理Bスプライン曲面(NURBS曲面)が、CADで扱う自由曲面では広く使われています。