⚠ ローカルファイルとして開いています。Chromeのセキュリティ制限によりコンソール警告が出ますが動作に影響はありません。

NURBS曲面の交差判定 — 有理ベジエクリッピング

ドーナツ・楕円体・円柱・曲面Bは円弧の厳密な有理ベジエ(NURBS由来)。交差判定は制御点の重みを使う有理ベジエクリッピングに対応。「非有理とみなす判定」ボタンで重み無視(w=1)の従来計算との比較が可能
★ 曲面A
曲面A: 32 パッチ
★ 曲面B(1枚の双3次・有理ベジエ)
制御点を表示
制御多角形を表示
「制御点を表示」ON の状態で、制御点をドラッグすると位置を動かせます。動かさずにクリックするとその点を選択し、下のスライダーで重み w を編集できます(既定 w=1)
重みをリセット
位置をリセット
★ ベジエクリッピング設定
両パッチがこの値より平坦になれば末端とみなし、平面どうしの交線を取り出す
FAT 平面クリップを使う
OFF にすると境界箱の棄却と4分割だけになります。判定ノード数の差が統計に現れます
非有理とみなす判定
ON:全制御点の重みを1とみなして(=従来の非有理ベジエクリッピングと同じ計算で)交差を求めます。
OFF:制御点の実際の重みを使う厳密な有理ベジエクリッピングで交差を求めます。同じ形状・条件で ON/OFF を切り替えて交差線や統計の差を比較できます。
表示設定
曲面A(青)
曲面B(橙)
交差曲線
ワイヤ
パッチ境界線
統計
計算モード
パッチ対
判定ノード数
棄却
クリップで収縮
末端パッチ対
交差線分数
計算時間
🖱 ドラッグ → 視点回転 🖱 ホイール → ズーム

S₁(u,v) = S₂(s,t) は未知数 4・条件 3 なので、解は 1 次元の交差曲線です。 (u,v,s,t) の 4 次元の箱に対し、凸包による棄却を 2 段構えで行います。

① 制御点の境界箱が重ならなければ交差しない(最も安い棄却)
② 一方の曲面を包む平行 2 平面(FAT 平面)を作り、他方からその平面への 符号付き距離 f(u,v)=n·S(u,v)−d を考える。有理曲面では f は分子 N=n·X−d·W (制御点について線形)を分母 W(常に正)で割った形になるので、f の符号や 帯 [lo,hi] への出入りは分子だけで判定できる(重み wij を掛けた 制御係数 wij(n·Pij−d) を使うだけで、非有理のときと 同じ次数のベジエ関数のまま扱える)。凸包性より、帯に入り得ない UV 範囲を 確実に削り落とせる。

曲線どうしの交点計算で使う FAT Line の曲面版にあたります。 捨てられなければ大きい方を 4 分割して再帰し(有理デ・カステリョによる厳密な 部分曲面の分割)、両者が十分平坦になった末端で平面どうしの交線を線分として 取り出します。

NURBS化について: ドーナツ・楕円体・円柱は、円弧を厳密に表す 有理2次ベジエ(3制御点・重み 1, cosΔθ/2, 1)を土台に、母線方向×回転方向の テンソル積(回転体のNURBS化アルゴリズム)で構成しています。楕円体は単位球の NURBSを (rx,ry,rz) でアフィン拡大縮小したものです。曲面Bもダブルクリックで 制御点の重みを編集でき、有理ベジエとして扱えます。

「非有理とみなす判定」をONにすると、全ての重みを1とみなして (=制御点の位置だけを使う旧来の非有理ベジエクリッピングと同じ計算で) 交差を求めます。OFFなら実際の重みを使った厳密な有理ベジエクリッピングです。 同じ形状のまま ON/OFF を切り替えると、重みを無視した近似計算がどれだけ 交差線をずらすかを比較できます。
視点: 左ドラッグ / ズーム: ホイール