第I部:曲面どうしの交差判定 第II部:球・三角形との衝突判定と貫通防止
2枚のパラメトリック曲面 S1(u,v)、S2(s,t) の交差線を求める問題(Surface–Surface Intersection、SSI)は、方程式としては単純だ。位置ベクトルの各成分(x, y, z)が一致する条件が3本、未知数は (u, v, s, t) の4個。条件数より未知数が1つ多いので、解は一般に1次元の曲線として現れる。
ただし、この方程式を素直にニュートン法などで解こうとすると難しい。非線形であるだけでなく、交差線が複数の成分(孤立したループなど)に分かれることがあり、良い初期値を与えないと一部の成分を見落とす。さらに2曲面が接するように交わる(接触交差)と、その近傍でヤコビアンがほぼ特異になり数値的に不安定になる。そこで、初期値なしに交差の「ある場所」を確実に見つけ出せる、大域的で頑健な手法が必要になる。ベジエクリッピング法はその代表格である。
Sederberg と Nishita が1990年に曲線どうしの交点計算として提案した手法で、のちに曲面どうしの交差判定へも拡張された。核心は「制御点の凸包性」を使って、交差があり得ないパラメータ範囲を安全に、かつ大胆に削り落とすことにある。
曲線 C1(t) と C2(s) の交点を求めたいとする。まず C1 の制御多角形をすっぽり包む、平行な2直線の帯(FAT LINE)をつくる(帯の向きは、たとえば C1(0) と C1(1) を結ぶ直線を使う)。次に、C2 の各制御点からこの帯の中心線までの符号付き距離を計算する。距離は制御点の座標について線形な量なので、この距離の列は C2 と同じ次数のベジエ関数 D(s) の制御点になる。
ベジエ曲線は自分の制御多角形の凸包の中に必ず収まる(凸包性)。したがって D(s) のグラフも、その制御点がつくる凸包の中に収まる。この凸包が帯の許容範囲 [dmin, dmax] と重ならない s の範囲は、「その部分に交点はあり得ない」と確実に判定でき、切り捨てられる。
切り捨てたあと、まだ範囲があまり縮まらない(目安として9割前後しか縮まらない)場合は、大きい方の曲線を t = 0.5 でデ・カステリョ分割して2つに分け、それぞれに対して再帰する。これを繰り返すと、両方の曲線の生存区間が急速に縮んでいき、最終的に両方とも直線とみなせるほど短くなったところで、直線どうしの交点として答えを確定する。
C1 の制御点を P0, …, Pn とする。FAT LINE の中心線には、最も単純で計算コストの低い選び方として、両端点を結ぶ弦(コード)を使う。
C1(t) は自分自身の制御点の凸結合なので、ei の凸結合として計算される C1(t) の距離も必ず [dmin, dmax] に収まる。これが「C1 を確実に包む」ことの根拠であり、dmin, dmax は中心線からのC1自身のはみ出し量そのものである(曲がりの少ない曲線ほど帯は薄くなり、クリップの効きが良くなる)。より精密には両端点でなく最小二乗フィットした直線を中心線に使う変種もあるが、実装が簡単な弦を使うのが一般的である。
C2 の制御点を Q0, …, Qm とすると、2.2で求めた同じ n, c を使って各点の符号付き距離 fi = n·Qi − c (i = 0,…,m) を計算する。これをそのまま制御点として並べたベジエ関数が D(s) である。
たとえば C2 が3次(m=3、制御点4個)なら D(s) = (1−s)3f0 + 3(1−s)2s f1 + 3(1−s)s2f2 + s3f3 という、ふつうの3次多項式になる。あとは D(s) の凸包(あるいは制御点を結んだ折れ線の上下包絡線)が帯 [dmin, dmax] と重ならない s の区間を求めればよい。
曲面どうしでも考え方はそのまま拡張できる。一方の曲面パッチの制御点net全体を包む、平行な2枚の平面(FAT PLANE)を作る。もう一方のパッチの各制御点から、この平面までの符号付き距離を計算すると、これも制御点について線形なので、元のパッチと同じ次数の「距離曲面」(1変数ではなく (u,v) の2変数ベジエ関数)になる。凸包性より、この距離曲面が帯 [dmin, dmax] に入り得ない (u,v) の領域を切り捨てられる。1次元のときと違い、u方向・v方向をそれぞれ独立に絞り込む形で近似的に処理する。
パッチ P の制御点net Pjk(u方向 j = 0,…,p、v方向 k = 0,…,q)から FAT PLANE を作る。曲線のときの「両端点を結ぶ弦」に対応するのが、ここでは「4隅の対角線」である。
曲線のときの dmin, dmax が [lo, hi] に、ei が sjk に、fi が Fjk に、そのまま対応している。平面を通す点に重心を使うのは、4隅だけでなく制御点net全体のバランスを取るための実務上の工夫で、必須ではないが安定した挙動になりやすい。
Fjk を制御点として並べたのが距離曲面 f(u,v) である。
Q が重み wjk を持つ有理パッチの場合、真の距離は f(u,v) = [n·X(u,v) − d·W(u,v)] / W(u,v) という分数式になる(X は重み付き制御点、W は重みだけのベジエ関数)。ただし重みが正である限り分母 W(u,v) は常に正なので、[lo,hi] に入り得るかどうかの判定には分子だけで十分であり、次数は上がらない。
実装上は、この2次元の判定を u方向・v方向それぞれ独立に行う。たとえばu方向を絞り込むときは、各 j について k方向の最小値 mink G1,jk を取って「u だけの」次数pのベジエ関数を作り、それが0以下になり得る u の範囲を求める(G2側は最大値 maxk G2,jk を使い0以上になり得る範囲を求める)。両方の範囲の共通部分が生き残る u 区間になる。v方向も同様に行い、絞り込めた (u,v) の矩形だけを残して分割・再帰する。
この4段構成(境界箱棄却 → FAT PLANE クリップ → 4分割再帰 → 末端の平面近似)が、ベジエクリッピング法によるSSIのすべてである。
最終的に描かれる「交差曲線」は、実は1本の滑らかな曲線として直接求まっているわけではない。手順4(末端処理)で見た通り、再帰を打ち切った時点のパッチはもう曲面としては扱われず、制御点net の4隅だけ(P0,0, P0,p, Pq,p, Pq,0)を結んだ平面四辺形に置き換えられ、これが対角線で2枚の三角形に分割される。曲面A側の末端パッチも曲面B側の末端パッチも同様に「2枚の三角形」になるので、両者の間で最大 2×2 = 4通りの三角形の組ができ、それぞれについて平面同士の交線を三角形の範囲内に切り詰めた線分を求める。
つまり交差線を構成する各線分は、元のNURBS曲面や有理ベジエパッチそのものの交線ではなく、再帰的な絞り込みの果てにできた、極小の平面近似どうしの交線である。再帰の深さ(本稿の付属ツールでいう「再帰分割深度」)や平坦度の許容誤差を細かくするほど、この折れ線は元の滑らかな交差曲線に近づく。ただし第6章で見るように、これは出力側の近似精度の話であり、入力となる曲面そのものが非有理近似で歪んでいれば、出力をどれだけ細かくしてもその歪みまでは取り除けない、という点には注意が要る。
NURBS曲面は制御点 Pij、重み wij、そして2方向のノットベクトル U, V で定義される、いわば「多くの区間で制御点を使い回す」効率的なデータ構造である。ベジエクリッピング法は、各パッチが他と独立した固定サイズの制御点netであることを前提にしているので、そのままでは使えない。そこで必要になるのが、NURBSを「区間ごとに独立した有理ベジエパッチの集まり」へ変換する操作である。
一般には、内部の各ノットの重複度が「次数と同じ」になるまでノット挿入を繰り返す(Boehm のアルゴリズム)ことで、幾何形状を一切変えずに NURBS をベジエ形式へ分解できる。これは任意の次数・任意のノット構造に対して機械的に適用できる、標準的かつ厳密(近似なし)な操作である。
円弧や楕円弧に限っては、ノット挿入を経由しなくても最初から「ベジエ形式」の有理2次曲線として直接書き下せる。中心 C、(直交している必要のない)軸ベクトル U, V を使って P(θ) = C + cosθ·U + sinθ·V と表される弧(Δθ = θ1 − θ0 が180°未満)は、次の3制御点・3重みの有理2次ベジエで厳密に再現できる。
トーラスや円柱のような回転体は、この弧の式を2方向に組み合わせる(母線方向の弧 × 回転方向の弧のテンソル積、重みは両者の積)ことで、厳密な有理ベジエ曲面になる。三軸の長さが異なる一般の楕円体は、まず単位球を上と同じ方法で回転体として構成し、そのあと制御点だけに (rx, ry, rz) のアフィン拡大縮小を掛ければよい(アフィン変換は重みを変えずに制御点だけ動かしても厳密性を保つ、という有理ベジエの性質を利用している)。
弧1本あたりの掃引角を180°未満(実務上は数値安定性のため120°以下)に保つ必要があるので、1周(360°)を有理2次ベジエで覆うには最低3分割が要る。半周(180°)だけなら2分割で足りる。これをふまえた実装上の分割数と、できあがるパッチの枚数は次の通り。
| 形状 | 方向ごとの分割 | パッチ枚数 | 1パッチの制御点数 | 備考 |
|---|---|---|---|---|
| ドーナツ(トーラス) | 主円 4×90° 断面円 4×90° |
4 × 4 = 16枚 | 3×3(双2次) | 主円・断面円ともに1周360°。理論上の最小は3×3=9枚(120°刻み、重み0.5)だが、重みが1に近く数値的に穏やかな4分割を採用。 |
| 楕円体 | 経度 4×90° 緯度 2×90° |
4 × 2 = 8枚 | 3×3(双2次) | 単位球を回転体として構成し、あとから (rx,ry,rz) でアフィン変形。緯度方向は極から極まで180°なので2分割で最小かつ十分。 |
| 円柱(側面) | 周方向 4×90° 高さ方向 1(直線) |
4 × 1 = 4枚 | 3×2(2次×1次) | 高さ方向は直線なので非有理・1次の2点で厳密。分割不要。周方向の重みだけが1でない混合次数パッチになる。 |
ここで重要なのは、いずれも「近似ではなく厳密」だという点である。ドーナツは16枚、楕円体は8枚という数字は分割の仕方(4分割 vs 最小3分割など)によって変わるが、どの分割を選んでも各パッチは円・楕円の弧を寸分違わず再現する。一方、次章以降で見るように、これを非有理の多項式ベジエで代用すると、パッチを何枚に増やしても厳密にはならず、有限の誤差が残り続ける。
結論から言うと、ベジエクリッピング法を有理ベジエ/NURBSへ拡張すること自体に、研究上の新規性はない。凸包性は重みが非負であれば有理ベジエでも成り立つことがNURBSの標準的な教科書(例えばPiegl & TillerのThe NURBS Book)でも述べられている既知の事実であり、SSIを主要テーマとするCAGD分野の文献や実務のCADカーネルでは、以前から有理曲面を意識したクリッピング/分割系のアルゴリズムが使われてきた。
その上で、本稿と付属ツールが明示的に書き下した実務上のポイントは新規ではないにせよ、教科書的な説明では省略されがちで書き留める価値がある。それは、有理曲面の距離関数 f = (分子)/(分母) は分母(重みの総和)が常に正である限り、符号や帯への出入りの判定を分子だけで行えるという点である。制御点ごとに wij·(距離) という重み付き係数を作るだけで、非有理の場合と同じ次数のベジエ関数のままクリッピングできる。明示的な除算も、微分による次数の上昇も必要ない。
| 手法 | 頑健性(見落としの少なさ) | 収束の速さ | NURBSへの適用 | 実装の手間 |
|---|---|---|---|---|
| 有理ベジエクリッピング (本稿の手法) |
高い(初期値不要) | 速い(帯が細く絞り込みが強い) | 直接可能 | 中(凸包判定・分割の実装が要る) |
| マーチング法 (追跡法・ニュートン法ベース) |
低い(種点が要る・孤立ループを見落としやすい) | 非常に速い(局所的には2次収束) | 直接可能 | 低〜中 |
| 単純な境界箱分割 (FAT PLANEを使わない再帰分割) |
高い | 遅い(境界箱だけでは絞り込みが弱い) | 直接可能(有理・非有理を問わない) | 低 |
| 多角形近似 (両曲面を細かく三角形分割して交差) |
分割密度に依存 | 分割密度に依存 | 直接可能 | 低(実装は容易) |
| 代数的(陰関数化) | 理論上は完全 | 高次数では実用不可 | 次数が上がると破綻しやすい | 高い(数式処理が必要) |
| 区間ニュートン法 | 高い(解の存在を保証) | ノードあたりのコストが高い | 直接可能 | 高い |
この整理から見えてくるのは、有理ベジエクリッピング法の立ち位置である。マーチング法のような速さはないが種点なしに全ての交差成分を確実に見つけられ、単純な境界箱分割や多角形近似のような頑健さを保ちながら、FAT PLANEという線形な絞り込みのおかげでずっと少ない再帰回数で収束する。そして本稿の主題である「NURBSへそのまま使える」という性質のおかげで、非有理ベジエへ変換して精度を落とす、という妥協が不要になる。次章では、その妥協がどれほどの精度低下を招くのかを具体的に確認する。
円弧・楕円弧は非有理(多項式)ベジエでは有限次数では厳密に表現できない。ここでは2種類の非有理近似について、実際にどれだけの誤差が出るかを数値で確認する。
CGでよく使われる κ = 4/3·(√2−1) ≈ 0.55228 という係数を使った3次ベジエによる90°円弧近似は、半径に対して最大で次の誤差を持つ(実際に数値計算して確認した値)。
1本の弧としては非常に小さいが、それでもゼロではない。これに対し、有理2次ベジエによる同じ90°弧は、浮動小数点の丸め誤差(10−16程度)を除いて完全に一致する。
位置と接線ベクトルを一致させる3次エルミート補間(本稿の付属ツールで最初にトーラス・楕円体を作っていた方式と同じ構成)で円をN分割したときの、最大半径誤差の推移を計算した。
| 分割数 N(1周360°) | 1区間あたりの角度 | 最大半径誤差 | 誤差(%) |
|---|---|---|---|
| 2 | 180° | 0.2146 r | 21.460 % |
| 3 | 120° | 0.0466 r | 4.655 % |
| 4 | 90° | 0.0152 r | 1.521 % |
| 8 | 45° | 0.00098 r | 0.098 % |
| 16 | 22.5° | 0.00006 r | 0.006 % |
| 3 または 4 (有理2次ベジエ) | 120° または 90° | ≈10−16 r | 厳密(機械精度) |
誤差はおよそ N−4で減っていく(Nを2倍にすると誤差はおよそ1/16になる)。つまり分割を増やせばいくらでも小さくできるが、ゼロにはならない。これに対して有理2次ベジエは分割数によらず常に厳密である。
形状の誤差は、そのまま交差線の誤差になる。付属ツールの既定配置(ドーナツ R=2.2, r=0.9、曲面Bを一枚差し込んだ状態)で、実際に「重みを使う(有理)」計算と「重みを1とみなす(非有理扱い)」計算を比較した。
| 曲面Bの制御点の重み | 交差線分数(有理) | 交差線分数(非有理扱い) | 対応点どうしの最大ズレ |
|---|---|---|---|
| すべて w=1(重みなし) | 255 | 253 | ほぼ 0(数値誤差の範囲) |
| 2点だけ w=3.0 と w=0.3 に変更 | 245 | 253 | 断面半径の 26.3% |
重みがすべて1(実質的に非有理と同じ)であれば当然ながら両者はほぼ一致する。しかし制御点の重みに意味のある差(3.0や0.3)を与えたとたん、重みを無視する近似は交差線を断面半径の4分の1以上も動かしてしまう。この大きさのズレは、クリッピングの再帰深度や平坦度の許容誤差をどれだけ細かくしても解消できない — 誤差の原因は数値計算の精度ではなく、入力する形状そのものが違うことにあるからである。
第I部で導入した有理ベジエクリッピングの部品(FAT平面クリップ・凸包性・4分割再帰)をそのまま使い、動く球や三角形とNURBS曲面がぶつかっているかどうかを判定する。
前稿で扱った交差判定(SSI)は、2枚の曲面 S₁(u,v)=S₂(s,t) を満たす (u,v,s,t) を求める問題で、答えは1次元の曲線だった。本稿の衝突判定は問いの形が違う。球なら「中心 C から曲面までの最短距離が半径 r 以下か」という不等式、三角形なら「曲面と実際に交わっているか」という真偽値を求めればよく、交差線という連続的な形状そのものは要らない。
この違いは計算の設計に直結する。交差判定では曲面全体を細かく追跡する必要があったが、衝突判定は「イエスかノーか」と「(必要なら)どこで」が分かればよいので、関係ない部分を早い段階でどんどん切り捨てることに集中できる。実際、本稿の手法は前稿のベジエクリッピングの部品(FAT平面クリップ・凸包性・4分割再帰)をほぼそのまま再利用しつつ、末端の扱いだけを衝突判定向けに変えたものになっている。
有理NURBS曲面 S(u,v) 上で中心 C までの距離を最小化する厳密な最短点を求めるには、距離の2乗 |S(u,v)−C|² を u, v で偏微分してゼロになる点を解く必要がある。S が有理式(分子/分母)だと、この偏微分は商の微分則を通るため分子の次数が跳ね上がり、しかも解は非線形連立方程式になる——曲面が動くたびに毎フレーム解くには重すぎる。
そこで、真の最短点を解く前に、中心 C・半径 r の球を包む一辺 2r の立方体(軸平行境界箱、6平面)で候補パッチを絞り込む。前稿で導入した FAT平面クリップの関数 clipToSlab(P, {n, d}, lo, hi) は、平面の法線 n・オフセット d と、帯の範囲 [lo, hi] さえ与えれば、どんな平面に対しても使える汎用の道具だった。軸平行境界箱の6面は、法線が単に x, y, z 軸方向であるだけの特殊なFAT平面なので、同じ関数がそのまま使い回せる。
再帰的な絞り込みで末端まで来た小さなパッチは、4隅の制御点(=有理ベジエでも厳密に曲面上にある点)を結んだ平面三角形2枚で近似する。あとは「点 C から、この小さな三角形までの最短点」を求めればよく、これは Ericson の Real-Time Collision Detection にある標準的な閉じた式で厳密に解ける。三角形を7つの領域(頂点3・辺3・内部1)に分け、C がどの領域の真上にあるかを内積だけで判定する。
この2段構え——境界箱で候補を絞り込み、末端では閉じた式で決める——によって、S(u,v) の微分を一度も計算せずに、有理NURBS曲面までの最短距離(が半径以下かどうか)を判定できる。
動く物体が三角形(ポリゴンメッシュの1枚を想定)の場合、球のような「中心と半径」という単純な指標がない。ここでは境界箱の代わりに、三角形自身がつくる厚み0の5面体(三角柱)を使う。
軸平行境界箱よりずっとタイトに絞り込めるため、実測(本稿のツールと同じドーナツ形状で)で判定ノード数・候補パッチ数が6〜8倍少なくなることを確認している。末端まで絞り込んだあとは、候補パッチの三角形と衝突オブジェクトの三角形の、三角形どうしの交差判定(前稿と同じ triTriSegment)で最終確定する。
アニメーションは離散的な時間刻みで進む。物体が小さい・速いと、ある1フレームでは表面の手前、次のフレームではもう表面の向こう側——という具合に、間の瞬間に触れていたはずなのに、サンプリングした2点のどちらでも交差が検出されないことが起こる。これが貫通(トンネリング)である。
1タイムステップで物体が進んだ距離を L とする。判定に使う半径を r ではなく r+L にするだけで、この見逃しを防げる。根拠は三角不等式である。
三角形の場合は、進行方向(sweepベクトル、前フレームから今フレームへの移動量)に三角形を押し出した立体を使う。これは3.の静止した三角形の5面体とまったく同じ構造になる——2枚の平面(始点側の三角形の平面・終点側の三角形の平面。並進移動なので法線の向きは変わらない)を薄いスラブとして1面、3つの辺をそれぞれ sweep 方向に押し出した平行四辺形の半空間を3面。あわせてやはり5面であり、面の数は静止時と同じまま、計算コストは増えない。sweep がゼロに近づけば自動的に静止版の式に一致する。
実装の最初のバージョンでは、三角形の貫通防止の最終判定を「候補パッチの三角形の3本の辺が、スイープした5面体を横切るかどうか」で行っていた。多くの場合はこれで正しく動くが、実際に負荷テストをしたところ、衝突オブジェクトを小さく・速くすると見逃しが残ることが分かった。
原因は次の通りである。スイープした5面体(三角柱)は衝突オブジェクト自身の大きさで決まる。オブジェクトが十分小さいと、この5面体が曲面側の候補パッチ(三角形)よりも小さくなることがある。そうなると、5面体が候補パッチの面の内側を貫通するのに、パッチの辺には一度も触れない——辺だけを見る判定はこのケースを取りこぼす。
修正は、候補パッチの三角形そのものを5面体の各面で順に切り詰めていく方法(Sutherland–Hodgmanのポリゴンクリッピング)に変更することだった。5枚の半空間で三角形を順番にクリップし、最後に何かしらの多角形が残っていれば接触とみなす。この方法は「5面体が三角形の辺を横切る」場合と「5面体が三角形の内部だけを貫通する」場合の両方を、区別なく正しく検出できる。
| 検証条件(負荷テスト) | 真の衝突回数 | 貫通防止 OFF・見逃し | 貫通防止 ON(修正後)・見逃し |
|---|---|---|---|
| 球・半径0.10・最高速度・左右往復軌道 | 36 | 8 | 0 |
| 三角形・一辺0.10・最高速度・左右往復軌道 | 28 | 8 | 0 |
実際のアニメーションループを再現した負荷テスト(150ステップ、細かい時間刻みでのブルートフォース判定を「正解」として比較)で、修正後は球・三角形とも見逃しゼロを確認している。
結論から言うと、ここで使った個々の要素技術——球の半径拡張、三角形のスイープ体積、ポリゴンクリッピングによる交差判定——はいずれも衝突判定・コンピュータグラフィックスの分野で既に確立された手法であり、本稿に研究上の新規性はない。半径拡張法は「保守的前進(conservative advancement)」や「スイープ球(swept sphere)」としてゲーム物理エンジンで広く使われ、スイープ体積を使う連続衝突判定(Continuous Collision Detection, CCD)も1990年代から活発に研究されている、成熟した分野である。
その上で、本稿の実装が持つ実務上の特徴は、これらの標準的な考え方を前稿のNURBS向けベジエクリッピング基盤にそのまま統合した点にある。境界箱も、三角形のスイープ5面体も、結局は「法線と帯 [lo,hi] を持つ平面のクリップ」という同じ clipToSlab 関数を呼んでいるだけであり、有理曲面の重みも自動的に正しく扱われる(前稿で導入した「重み付き係数で次数を上げずに判定する」性質がそのまま効く)。専用の衝突判定パイプラインを別に書く必要がない、という点は地味だが実装上の利点である。
| 手法 | 頑健性(貫通の有無) | NURBSへの適用 | 実装の手間 | 備考 |
|---|---|---|---|---|
| 本稿の手法 (境界箱/5面体クリップ+半径拡張・スイープ体積) |
高い(検証済み・見逃し0) | 直接可能 | 中 | 前稿のクリッピング基盤を再利用 |
| 離散サンプリングのみ (各フレームの位置だけ判定) |
低い(貫通が起きる) | 直接可能 | 低 | 実装は最も簡単だが、速い・小さい物体に弱い |
| GJK/EPA + 保守的前進 (凸包どうしの距離を反復計算) |
高い | 凸多面体近似が必要 | 高い | ゲームエンジンで標準的。NURBSは事前に多面体近似するのが普通 |
| 投機的接触 (速度方向に境界を先読みして拘束を先に作る) |
高い | 多角形メッシュ向け | 高い | 物理エンジンで接触の「めり込み」防止に使われる、やや発展的な手法 |
| 時間刻みを十分小さくする (サブステップ分割) |
速度次第 | 直接可能 | 低 | 確実性はステップ数に依存し、計算コストとのトレードオフ |
要するに、本稿の位置づけは「NURBSの厳密な形状表現と、確立された連続衝突判定の考え方を、同じベジエクリッピングの土台の上で自然につなげた」というところにある。個々の要素はどれも車輪の再発明ではないが、有理曲面の重みを特別扱いせずに済む形で貫通防止まで一貫して実装できる、という組み合わせ方には一定の実用的な価値がある。
ここまでは球・三角形の側から衝突判定の仕組みを見てきたが、ここでNURBS曲面の次数 n(双次数 (p,q))を主役にして、「クリップ平面までの距離」と「真の最近点」がそれぞれ何次の式になるのかを具体的に導出する。後半の次数はここで実際にコンピュータ代数(sympy)を使って検証した値であり、既存の教科書の記述をそのまま引き写したものではない。
u方向に次数 p、v方向に次数 q の有理ベジエ(NURBSを分解した1パッチぶん)を、制御点 Pij、重み wij(i=0,…,p、j=0,…,q)を使って次のように書く。
平面(単位法線 n̂、原点からの符号付き距離 d)までの符号付き距離は次の通り。
これは境界箱の6平面クリップでも、三角形のスイープ5面体クリップでも同じ構造だった——法線がどんな向きでも、距離関数の次数は常に元の曲面と同じままである。次章の最近点探索とは対照的な、良い性質である。
点 C までの最短点を求めるには、距離の2乗 D(t) = |S(t)−C|² を微分してゼロになる t を解けばよい。これを実際に最後まで展開すると、どんな次数の多項式になるだろうか。
準備:分子だけの式に持ち込む
Y(t) := X(t) − C·W(t) とおくと、S(t)−C = Y(t)/W(t) なので D(t) = |Y(t)|² / W(t)²。商の微分則を適用し、分母 W(t)³ を払うと、D'(t)=0 は次の式と同値になる。
最高次の項がちょうど消える
ところが、実際に展開すると最高次の項(t3n−1 の係数)が恒等的に消えることが分かる。理由は次の通り。
E(t) = Y(t)·Z(t) で、Y の次数は n、Z の次数は 2n−2 なので、E(t) の次数は n + (2n−2) = 3n−2。素朴な見積もりの 3n−1 より1つ低い。この結果は本稿執筆にあたり実際にコンピュータ代数(sympy)で n=1〜5 の乱数係数の有理曲線を作り、展開して次数を数えて確認した——理論的な見積もりだけでなく、具体的な数値でも一致している。
| 次数 n | 非有理曲線 (2n−1次) | 有理曲線=NURBS (3n−2次) |
|---|---|---|
| 1(直線・弧) | 1 | 1 |
| 2(2次) | 3 | 4 |
| 3(3次) | 5 | 7 |
| 4(4次) | 7 | 10 |
| 5(5次) | 9 | 13 |
| 6(6次) | 11 | 16 |
非有理(重み一定)の場合との対比
重みがすべて等しい(W が定数、W'=0)非有理の場合は、E(t) = Y·Y'·W がそのまま残り、Y=X−C(次数n)、Y'=X'(次数n−1)なので、E の次数は単純に 2n−1。これは古典的によく知られた「非有理ベジエ曲線の最近点は2n−1次の多項式を解けばよい」という結果と一致する。有理化すると、この 2n−1 が 3n−2 まで増える——差は n−1 で、n が大きいほど開いていく(図4)。
曲面 S(u,v)=X(u,v)/W(u,v)(双次数 (p,q))では、D(u,v)=|S−C|² を u, v それぞれで偏微分してゼロとおいた、2本の連立方程式を解くことになる。曲線の場合と同じ手順(Y=X−CW とおき、商の微分則を適用し、最高次の項の打ち消しを確認する)を u 方向・v 方向それぞれに適用すると、次の次数が得られる(これも実際に複数の (p,q) の組み合わせでsympyにより数値的に検証済み)。
| n次(p=q=n) | 非有理曲面 2本の方程式の双次数 | 有理NURBS曲面 2本の方程式の双次数 |
|---|---|---|
| n=1 | (1,2) と (2,1) | (1,3) と (3,1) |
| n=2 | (3,4) と (4,3) | (4,6) と (6,4) |
| n=3 | (5,6) と (6,5) | (7,9) と (9,7) |
2本の曲線(双次数の代数曲線)が (u,v) 平面上で交わる点の最大個数は、双次数 (a₁,b₁) と (a₂,b₂) の曲線どうしなら a₁b₂+a₂b₁ 個という、双次数版のベズー限界で見積もれる。p=q=n の有理NURBS曲面にこれを当てはめると、最大で 18n²−12n+4 個の臨界点(極大・極小・鞍点すべて含む)があり得ることになる——n=2 で52個、n=3 で130個。境界箱による前処理なしに、毎フレームこの数の解を持ちうる連立方程式を直接解くのは現実的でない。
ここまでの結果をまとめると、有理NURBS曲面に対して行う2種類の操作は、次数の増え方がまったく違う。
この非対称性こそが、前2稿で採用した設計——「真の最近点を直接解く」のではなく「境界箱で候補パッチを絞り込み、末端では平面近似した三角形どうしの最短点(微分不要の閉じた式)で済ませる」——の理由である。距離関数(クリップに使う量)の次数が増えないという性質のおかげで、境界箱による絞り込み自体は速く行える。一方、真の最近点を解く操作は最後まで避け続け、十分小さくなった末端パッチでは「平面上の最短点」という定数次数(微分不要)の問題にすり替えることで、n がいくら大きくても計算コストが跳ね上がらないようにしている。