私は、Javaでプログラムを作っています。ここで、円はお互いに跳ね返り、互いに向かって重力をかけることができます。2D物理シミュレーションで重なっているボディ
ほとんどの場合(画面の円はほとんどありません)、目立つバグはありません。この問題は、画面に大量の円がある場合に発生します。場合によっては、混雑しすぎるとサークルが重複することがあります。まるで他のすべてのサークルの重さがサークルを一緒に粉砕して重なり合っているかのようです。もちろん、そこにはサークルの重さがどれくらいか分からないので、実際には粉砕していません。おそらく、衝突の解決を処理するロジックは混雑した状況を処理できません。
円は配列に格納され、各円はforループを使用して配列を通過し、それ自体を他の円と比較します。この円の中心と他の円の中心との間の距離がそれらの半径の合計よりも小さい場合、円は衝突している。両方の円の速度は、衝突の式を使用して更新されます。
円が囲まれていると、後ろの円に更新されたベロシティが表示されることがあります。言い換えれば、2つのサークルは、既に接触していても、互いに向かって移動するように指示されます。このようにオーバーラップすると、オーバーラップを元に戻さない理由はわかりません。
私は重なり合っている場合、それらが重なっている距離を見つけて、それらを互いに離して移動することで、タッチシナリオを復元しようとしました。それぞれがオーバーラップ距離の半分を動かします。これはサークルの速度を変更せず、その位置だけを変更します。
これでも問題は解決しません。円が囲まれ、隣接する円のいずれかと重なっている場合、その位置は重複しないように変更されますが、この新しい位置によって別の円と重なることがあります。同じ問題。
重力が無ければ、最終的に広がって重なり合う問題は解決されますが、重力が原因でこのことが回避されます。
詳しい情報:衝突後に新しい速度を計算する際
重力を考慮しません。
返信いただきありがとうございます。私は安い修理を最初に試してみたいと思います。今のところです。私はおそらく最終的に適切な修正をしたいと思うでしょう。あなたは「時間を逆転」しなければならないと言っていますか?プログラムが衝突を検出すると、サークルはすでに重複している可能性があります。だから、円が触れていて、衝突を解決したときの速度が何であったかを把握すれば、これは私の問題を解決するでしょうか?これは複雑になるようです。彼らは円が衝突するのを加速したので、衝突に関与していないサークルの「時間を逆転させる」必要がありますか? – Croolsby
私の答えは、適切なアプローチに関するいくつかの情報で更新されました。時間を逆にする必要はありませんが、将来の衝突を予測し、任意の量だけ時間を進めることができる必要があります。 – vaughandroid