2011-01-01 12 views
1

私はTriangle-> AABB衝突アルゴリズムを持っており、AABBが衝突した三角形を戻しています。私は三角形の3つのベクトルを期待していましたが、動きの方向/大きさによって偏向されたベクトルが決まるので、角度をつけて壁に対して走ったときに、衝突角に応じて遅く動きますが、壁。これは、衝突がないときに移動するだけで、粘着性の衝突問題を取り除く。どんな提案や参考資料も大歓迎です!ありがとう。どのように方向/大きさベクトルと衝突した三角形に基づいて方向/大きさベクトルを偏向できますか?

答えて

0

速度の成分を三角形の法線に沿って削除します。

考え方は、動きを三角形の中に移動する部分と残りの部分(垂直方向になる)として表現できるということです。残りの部分だけを動かすと、動きによって三角形に近づくことはなくなります(さらに、衝突を検出してはいけません)。擬似コードで

:まっすぐで動作しているとき、そうすることは非常に迅速にあなたが壁に沿ってスライドさせると同じように、これは意図的に、動きベクトルの大きさを保持しないことを

// v := velocity vector of moving object 
// p[3] := points that make up the triangle 

triangle_normal = cross(p[2]-p[0], p[1]-p[0]) 
problematic_v = project(v, onto=triangle_normal) 
safe_movement = v - problematic_movement 

注意。

さらに詳しい情報や良い画像については、GamasutraのPool Hall Lessons: Fast, Accurate Collision Detection Between Circles or Spheresをご覧ください。あなたは球を使用していませんが、あなたは本質的に完全なプラスチック(衝突しないので衝突)をしています。

+0

うーん、私はあなたに従うかどうか分かりません。三角形のベクトルを正規化してから方向/大きさを減算すると、何もしないように見えます。もう少し詳しく教えていただけますか? – JeanOTF

+0

三角形と大きさ/方向のベクトルは、いずれも3次元です。 – JeanOTF

+1

"正常"と "正規化"は実際には無関係な単語ではないでしょう。私は更新します。 – me22

0

まず、大きさ/方向をベクトルに変換します(はるかに便利です)。

そして(C++):

float towards=dot(velocity,norm); // velocity component into triangle 
if(towards<0)      // is moving into triangle 
    velocity-=towards*norm;   // remove component 

それが三角形に移動できません。 towards<0は、通常の状況に応じて逆にする必要があります。それを押し出す春の力を持っていることもうれしいです。

+0

私は両方の提案を試みましたが、残念なことにこれらのソリューションのどちらも私のために働いていませんでした。私は推測し続ける必要があります – JeanOTF

関連する問題