2012-03-01 17 views
0

私は、90度未満の角度で同じ方向に衝突する場合を除いて、一般的に動作する衝突するボールを備えたシステムを持っています。ボールの衝突の問題

Diagram of colliding balls problem

上記ボールはおそらく衝突面であるが、それは間違った方向から外れ、それを送信し、それが他のボールを「次の」黄色の線に衝突しようとするためです。衝突のための一般的なアルゴリズムは、次のとおり

衝突面に垂直であり、表面法線に垂直な部分が変更されていない表面法線に平行な方向の成分を否定
dot = direction.surface; 
parallel = surface * dot; 
perpendicular = direction - parallel; 
direction = perpendicular - parallel; 

誰にもこの問題の修正がありますか?私は何か間違ったことをした?

編集:だから今、私はコメントを追加しました:

average = (ball1.velocity + ball2.velocity)/2; 
ball1.velocity -= average; 
ball2.velocity -= average; 

を上記の計算を行う前に、その後:

ball1.velocity += average; 
ball2.velocity += average; 

右基準フレームで取得するには、@ベータ版の回答によると。問題は今、ボールのスピードが維持されないことです。なぜなら、スピードと質量が同じで、衝突後にボールが異なるからです。私はこれが起こるはずだとは思わないか、それとも?

+0

このメソッドは、モーメント中心のフレームで使用するためのものです。それは物事を明確にするか、もっと説明すべきか? – Beta

+0

少し説明してもらえますか?このメソッドを使用するオンラインでは非常に多くの例がありますが、それは必ずしも機能しません。 – slartibartfast

+0

長い説明です。参照フレームを変更するという考え方に精通していますか? – Beta

答えて

2

ボールを壁から跳ね返す1Dの問題を考えてみましょう。シンプル。

飛行中のジェット機の前方隔壁からボールを​​跳ね返すのを見てください。ボールは北に252m/s、バルクヘッドは北に250m/sで移動しています。答えは明らかではありません。しかし、私の座標系へのシフト(すべてから250m/sの隔壁の速度を差し引くことによって)と問題は簡単です。それを解決し、結果を地上のフレームに戻します(によって 250m/sを追加することによって)完了です。

ここでは、ボールが角度をつけて壁を跳ね返るという2次元の問題があります。シンプル。 (ただし、あなたのコードが正しく動作することを確認してください。)

2つのボールが等しく反対のモーメントで衝突します(私は彼らが同じ質量を持っていると仮定します)。あなたは衝突面に黄色い壁があると想像することができ、その答えは簡単に来ます。

2つのボールは衝突しますが、速度はではなく、になります。まだ黄色い壁がありますが、動いています。さて、すべてのボールの速度(合計/ 2)の平均を引いて壁のフレームに移動し、より簡単な問題を解決し、同じ速度をすべてに戻して戻ってみると、完了です。

+1

よかった、ありがとう。 1つの質問のみ:両方のボールのスピードが同じ場合、スピードは衝突後も同じでしょう。 – slartibartfast

+0

必ずしもそうではありません。運動量中心のフレームを使うことはすばらしいテクニックです。多くの不可解な代数から私たちを救うことができます。あなたがこの技術に本当に慣れてくるまで、さらなるショートカットをとろうとしないでください。 – Beta

+0

しかし、私が現在設定しているのは、方向単位ベクトルと速度変数があり、方向ベクトル上でのみ衝突物理を実行するということです。それで、常に同じスピードを持っていればいいのですが、方向ベクトルは常に単位ベクトルです。 – slartibartfast