[404] Dycoon : "球とBezier曲面の衝突判定" | Bezier Clippingによる球とBezier曲面の衝突判定
[デモンストレーション]
実行ファイル148kbyte(Windows98以降, OpenGL1.1)
画面は Pentium2 400MHz Geforce 搭載のPCで実行したもの.10FPS程度
Pentium4 2.2GHzですら画面と同じような状態でも25FPS程度である. 全部ボールを落とせば60FPSを超えるので 衝突判定のコストがその程度には かかっているものと思われる.
[操作方法] マウスで画面をドラッグすると teapotと床が傾きます. zキーでボールを追加して視点が新しいボールに向けられます.
...Sun Aug 25 00:20:03 JST 2002
- Dycoon : ...Sun Aug 25 00:24:33 JST 2002
- ちなみに現在描画1回につきシミュレーションは2ステップ進ませています.
衝突判定も描画1回につき2回おこなっております.
- Dycoon : ...Tue Aug 27 22:57:52 JST 2002
- [大まかな手順]
Bezier曲面S(u, v),球の中心点Pt間の距離を求め, その距離が球の半径以内ならば衝突と判定する.
ここでBezier曲面S(u, v)は次のように表すものとする. S(u, v) = |(1 - u)^3 (1 - u)^2*u (1 - u)*u^2 u^3| * |P00 P01 P02 P03||(1 - v)^3 | |P10 P11 P12 P13||(1 - v)^2*v| |P20 P21 P22 P23||(1 - v)*v^2| |P30 P31 P32 P33||v^3 |
点とBezier曲面の距離の求め方
・Bezier曲面と点との距離が極値となる点 Bezier曲面と点との距離が極値となるBezier曲面上の点S(u, v)は 次の方程式を満たす. (S(u, v) - Pt)・∂(S(u, v) - Pt)/∂u = 0 (S(u, v) - Pt)・∂(S(u, v) - Pt)/∂v = 0 これらはBezier曲面なので 両方の解を満たす解の領域を絞り込む形で Bezier Clippingをおこない,方程式を満たす点を列挙する.
・Bezier曲面のEdgeと点との距離が極値となる点 BezierのEdgeを次の次のように表す E00_03(t), E00_30(t), E30_33(t), E03_33(t) E00_03(t) = P00*(1 - t)^3 P01*(1 - t)^2*t P02(1 - t)*t^2 P03*t^3| ..... それぞれに対して 距離の極値となる点は 次の方程式を満たす. (E(t) - Pt)・∂(E(t) - Pt)/∂t = 0 これはBezier曲線なので Bezier Clippingで方程式を満たす点を列挙する.
これらの点とBezier曲面の四隅の点のうちで 最も近い点を最短距離の点とする.
返信 編集 |
|