Curves & interpolation

B-Spline

Bスプライン

制御点の局所的な調整で長い滑らかな曲線を作る。

4 / 10

Interactive demo

Preparing the demo…

B-Spline

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

たくさんの制御点を持つ長い曲線を、1 つの制御点を動かしても近くの区間しか変わらないように作る方法です。曲線は各区間ごとに、近くの数個の制御点の重み付き平均として決まります。曲線は制御点を通らない代わりに、つなぎ目まで非常に滑らか(3 次なら 2 階微分まで連続)になります。

ゲームでの使いどころ

  • 長いコースや線路:レースのコース、ジェットコースター、列車のレールなど、部分ごとに手直ししたい長い経路。
  • ロープ・ケーブル・触手の形状:物理シミュレーションした点列をそのまま描くとカクカクするので、B スプラインで滑らかに描き直します。
  • カメラやエフェクトの平滑化:ノイズの乗った入力(手ぶれ、トラッキングデータ)を、B スプラインで近似して滑らかにします。
  • モデリングの基礎:サブディビジョンサーフェス(Catmull–Clark)は、3 次 B スプライン曲面を任意の形状に一般化したものです。

しくみ

pp 次の B スプラインは、制御点 Pi\mathbf{P}_i と基底関数 Ni,p(u)N_{i,p}(u) の和で表されます。

C(u)=∑i=0nNi,p(u) Pi\mathbf{C}(u) = \sum_{i=0}^{n} N_{i,p}(u)\,\mathbf{P}_i

基底関数はノット列 u0≤u1≤…u_0 \le u_1 \le \dots から Cox–de Boor の漸化式で定義されます。

Ni,0(u)={1ui≤u<ui+10それ以外,Ni,p(u)=u−uiui+p−uiNi,p−1(u)+ui+p+1−uui+p+1−ui+1Ni+1,p−1(u)N_{i,0}(u) = \begin{cases} 1 & u_i \le u < u_{i+1} \\ 0 & \text{それ以外} \end{cases}, \qquad N_{i,p}(u) = \frac{u - u_i}{u_{i+p} - u_i}N_{i,p-1}(u) + \frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}}N_{i+1,p-1}(u)

ポイントは、Ni,pN_{i,p} が区間 [ui,ui+p+1)[u_i, u_{i+p+1}) の外では 0 になることです。つまり制御点 Pi\mathbf{P}_i が影響するのは p+1p+1 区間だけ。これが局所制御性の正体です。3 次なら、どの点を動かしても変わるのは 4 区間です。

両端の曲線を端の制御点に一致させたいときは、ノット列の両端に同じ値を p+1p+1 個並べます(クランプ)。デモもこの形です。

実装のポイント

曲線上の点は de Boor のアルゴリズム(ベジェの De Casteljau を一般化したもの)で安定して求められます。

  • 一様 3 次なら行列 1 つ:ノット間隔が等しい一様 B スプラインは、4 点の区間ごとに固定の 4×4 行列で評価できます。GPU での大量評価に向きます。
  • 通過点を指定したい場合:B スプラインは制御点を通らないため、「この点を通したい」ときは連立方程式を解いて制御点を逆算する(補間)か、カトマル・ロムを使います。

つまずきやすい点

  • 制御点を通らない:レベルデザイナーが「点を置いたのに曲線がそこを通らない」と戸惑う原因です。エディタでは制御ポリゴンを一緒に表示するのが親切です。
  • 次数と滑らかさ:1 次は折れ線、2 次は接線まで連続、3 次は曲率まで連続。次数を上げるほど滑らかですが、1 点の影響範囲も広がります。
  • ノットの重複:内部のノットを重ねると、その位置で連続性が下がり角を作れます。意図せず重複させると不自然な折れが生じます。

デモで試すこと

  1. 白い制御点をどれか 1 つドラッグしてください。黄色く強調された区間だけが変形し、水色の区間はまったく動きません。
  2. 次数を 1 → 2 → 3 と上げると、影響する区間が 2 → 3 → 4 と増え、同時に曲線が滑らかになります。
  3. 小さな白い目盛りは区間の境目(ノットの位置)です。つなぎ目がどこにあるか分からないほど滑らかなことを確認してください。

References

The Book of Shaders — Shaping Functions ↗

A general reference for this subcategory.