Sunday, May 24, 2009

球の衝突判定実験











Bridsonさんらの論文に書いてある衝突判定法を用いてFEM法で作った球で衝突判定の実験をし,この衝突判定法で判定ができることを確認した.
実験のために以下の準備をした.
・球のメッシュの頂点を移動可能にし,速度と加速度を設定できるようにした.高い精度が必要ないので,オイラー法でシミュレーション.
・球の下に面を配置し,衝突判定をする.ここでのリアクションは,衝突していると判定された頂点は動かないようにする.
・球に下向きに加速度をかけ続ける.なんとなく重力加速度を意識した.
この実験の結果が上の数枚の画像.左側はメッシュのエッジの描画で,右側はそれに面をつけてレンダリングした結果.

ここでは,Bridsonさんらの論文の説明が不親切な部分があるので,少しメモを残しておく.

この衝突判定法は,三角形x1x2x3と点x4の衝突を検知する手法.というか,結構一般的な手法なので,Bridsonさんらの論文を読まなくても,CGの数学関係の本には書いてあること.

まず,点x4と三角形x1x2x3を含む平面の距離を計算し,接触の距離h以下の点x4を判定する.準備として2個のベクトルを計算する.1個は,頂点x3(実はx1でもx2でも十分)から点x4までのベクトルを計算したベクトル.もう1個は,三角形の法線ベクトルnを計算したベクトル.これら2ベクトルの内積は平面からの距離であり,条件(x4-x3)・n < hが満たされるとき,x4と三角形x1x2x3の平面は接触しているとする.

次に,点x4を平面上に射影した点x'4が,三角形x1x2x3の内側か判定する.内側ならば,三角形と点は接触している.次の連立方程式を解き,その解を条件式にはめることで判定できる.
(x1 - x3)・(x1 - x3)w1 + (x1 - x3) ・ (x2 - x3)w2 = (x1 - x3)・(x4 - x3)
(x1 - x3)・(x2 - x3)w1 + (x2 - x3) ・ (x2 - x3)w2 = (x2 - x3)・(x4 - x3)
1 = w1 + w2 + w3
点x'4は,x'4 = w1 x1 + w2 x2 + w3 x3である.また,w1とw2がw1>=0, w2>=0, 1-w1-w2>=0を満たしていれば,点x'4は三角形の内側である.
以上のように,接触の判定を行う.

ちなみに,今回のリアクションは,適当に設定したため,論文のモデルに則っていない.

No comments: