編集/更新:私の今の最大の質問は、ステップ3の「t = ...」式が良いアイデアか、それを行うより良い方法かということです。他のほとんどの問題は部分的または完全に対処されていますが、この問題に関するコメントや回答はありません。繰り返しになりますが、分析ソリューションがおそらく必要であり、速度と距離が大きすぎ、オブジェクトが小さすぎるため、私が考えることができる反復/再帰ソリューション(コメントで以下にいくつかを提案します)この種の状況をうまく処理する特別な反復/再帰ソリューションであれば、私は間違いなくそれを受け入れます)。これまでのご協力に感謝します。皆さんはすばらしく、あなたの考えと助けに本当に感謝しています!
小さい高速オブジェクト間の衝突を検出しようとしています。これは、比較的低速であっても、トンネリングが非常に簡単に発生する可能性がある状況です。
レイキャスティングは機能しません。これは、1つのオブジェクトと静止した壁の間ではなく、2つの高速オブジェクト間の衝突を検出しているためです。(レイキャスティングを誤解していない限り?)パフォーマンスは非常に重要です。可能な限り、パフォーマンスの大幅な低下を避けたいと思います。機能的で非常に効果的なクアッドツリー(http://en.wikipedia.org/wiki/Quadtree)を既に実装しているので、以下に説明するように変更して使用します。
編集:時間間隔を短くしても機能しません。このソリューションには速度が高すぎます。つまり、トンネリング衝突の大部分を逃しながら、パフォーマンスヒットが大きすぎるということです。(たとえば、時間間隔ごとに数百万単位で測定される速度で移動する約1単位のサイズのオブジェクトがあるかもしれません...)
提案された解決策:
ステップ1:
各オブジェクトの動きを囲むボックスを作成し、それらのボックスを四分木に入力して、衝突の可能性のある初期リストを生成します。次の画像を参照してください(この画像は、ある位置から別の位置に移動する円形オブジェクトと、四角形を生成する動きを示しています。四角形は四分木に供給されます)。
ステップ2:(このステップをスキップしたいですか?)
四分木によって生成される可能性のある衝突のリストを調べます。起こりうる各衝突で長方形が交差するかどうかを確認します。その場合は、手順3に進みます。
編集:以下、ショーン・ミドルディッチは、掃引ボリューム/カプセルの交差点の使用を提案しました(オブジェクトが円の場合)。次の3つのオプションがあります。1)ステップ2を完全にスキップします。2)自分のやり方でステップ2を行います。3)ショーンのやり方でやる。ショーンの方法は私のボックスのアイデアよりも計算コストが高くなりますが、私の方法よりも多くの誤検知を排除し、最終ステップに到達できないようにします。
これらの3つの選択肢のうち、どれが最良であるかについて、経験からだれでも話すことができますか?(この物理エンジンをいくつかの異なる目的に使用するつもりなので、どのソリューションを簡単に測定できる特定のテストケースだけでなく、さまざまな状況で最速で動作する「一般的に最高の」ソリューションを探しています最速です)。
ステップ3:
判別式(つまり、平方根の下の部分)が負または0、衝突なし、正の場合、t =式を使用し、衝突の時間としてt値を使用します(その後、それに応じて位置を簡単に調整できます)。 ..衝突後も両方のオブジェクトが存在し続ける場合)。方程式:
t =(-1/2 sqrt((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz)^ 2-4(w ^ 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2)(a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2))-a w + a xb y + b z + c wc x + d yd z)/(w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 )。
ここで(1と2はオブジェクト1と2を示すために使用されます):
tは0〜-1の負の時間値です。0は現在のフレーム、-1は前のフレームです。
a = x位置1;
b = y位置1;
c = x位置2;
d = y位置2;
w = x速度1;
x = x速度2;
y = y速度1;
z = y速度2;
r =半径1;
s =半径2;
導出:(^ 2は二乗を意味します)
オブジェクトの動きのパラメトリック方程式(たとえば、newxpos1 = a + t w)を取り、それらを距離の式に差し込みます(両側を二乗):距離の式の2乗=(a + t w-(c + t x))^ 2 +(b + t y-(d + t * z))^ 2。tが負になることを忘れないでください。2つの円形オブジェクトの衝突時間を見つけるには、左側を(r + s)^ 2に設定します。二次方程式(および非常に退屈な代数)を使用してtを解くと、上記の「t = ...」方程式が得られます。
私の質問:
1)これは良い方法ですか?それはまったく機能しますか?予期しない問題が発生しますか?(一度に3つ以上のオブジェクトが衝突すると問題が発生することはわかっていますが、実際に反対するのは、相対速度が低い場合のみです(相対速度が高い場合は、アルゴリズムが提供する「グーフィー」ソリューションは「十分」であり、人間がエラーを見ることは不可能です)、同じタイムステップで2つ以上が低い相対速度で衝突する場合、ほとんどのソリューションはとにかく十分に近づいてください、私はたくさんの非弾性衝突を持つつもりはないので)
2)パフォーマンスは大きく低下しますか?そうなるとは思いませんが、もしそうなら、もっと良い方法はありますか?
3)ステップ2をスキップして、ステップ1から3に直接進む必要がありますか?明らかにステップ2は重要ではありませんが、パフォーマンスを向上させる可能性があります(または、保存するよりも多くのCPU時間を要する場合があります)。
他のすべてのコメント、提案、または批判は大歓迎です。ご協力ありがとうございました!