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

動く球の衝突時刻検出

F(u,v,t)=|S(u,v)−C(t)|²−r² の零点を3変数ベジエクリッピングで解く — 線分に沿って動く球が曲面に初めて接触する時刻と接触点
★ 形状選択
32パッチ / 290制御点
★ 球の軌跡(線分 A → B)
線分長
軌跡は t について1次なので、F は (u,v) について 6×6 次、t について 2 次。 係数は 7×7×3 = 147 個です。
★ ベジエクリッピング設定
uv の4分割と時刻の2分割を交互に行います
表示設定
半透明曲面
曲面ワイヤ
軌跡
開始位置の球
衝突位置の球
パッチ境界線
▶ アニメーション
結果
衝突時刻
始点からの距離
接触点
統計
パッチ数
F の次数6×6×2 (147係数)
判定ノード数
凸包で棄却
時刻で枝刈り
計算時間
🖱 ドラッグ → 視点回転 🖱 ホイール → ズーム

球が線分 A→B に沿って動くとき、時刻 t を第3のパラメータに加えると F(u,v,t) = |S(u,v) − C(t)|² − r² は 6×6×2 次の3変数ベジエ関数になります。

凸包性は変数が増えても同じように成立するので、判定も同じです。 箱の中で全係数が正なら、その時間帯・その領域では絶対に衝突しないと確定でき、 符号が混在する箱だけを分割します。接触が確認できた時刻を上界として、 それより遅い箱は丸ごと捨てます(分枝限定法)。

時刻を離散サンプリングしないため、高速に動く球が薄い部分をすり抜ける現象 (トンネリング)が原理的に起きません。半径を小さくして 注ぎ口や取っ手をかすめる軌跡を与えても、接触は必ず検出されます。
視点: 左ドラッグ / ズーム: ホイール