[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曲面の四隅の点のうちで
最も近い点を最短距離の点とする.

返信 編集