0

これはすでに答えられていると思うかもしれませんが、そうではありませんでした。ある時点で実際の交差点を確認するだけでは、実際には答えられないからです。

ここに画像の説明を入力

画像では、「サイドヒット」は最後の位置に依存します。長方形が上から来ている場合、大きな長方形の側面ヒットは下でした。ただし、長方形が右から来る場合、サイドヒットは右のものになります。

ゲームの弾丸、つまり高速オブジェクトにやや複雑な衝突検出を実装できたので、これはすべて本当に私を悩ませます。単純な衝突が最も簡単だと思っていました。しかし、検出するだけでなく、実際に応答する必要があるため、単純な衝突アルゴリズムは苦痛になります。

私の質問は、最後の位置や外部リソースを使用して実際に最適な答えを計算するなど、交差点に依存する可能性があるが正確な、実際に機能的で完璧な衝突アルゴリズムを実装する方法です。もちろん、これはコーナーでのみ問題を引き起こしています。しかし、それはどこにも問題を引き起こすことはできません。

(最後の位置を使用することは明らかな答えのように思えますが、情報を処理して出力に到達する方法がわかりません。そのため、質問を作成しました。試してみましたが、今は頭が痛いです)

4

2 に答える 2

1

私は詳細な回答をするつもりでしたが、この投稿に対する受け入れられた回答は、私が言おうとしていたことをほぼ要約しています. これは、最初に基本的な衝突検出を試みたときに遭遇する一般的な問題です。この問題の解決策は想像以上に複雑で、本質的には衝突点でのオブジェクトの位置を計算することです。

編集: 2 つのオブジェクトが衝突した時刻を正確に把握するには、次のようにします: (未テスト)

onCollide(obj1, obj2)
{
    t = 0; //parametric value to store when objects first collided
    // calculate when the obj1's left side collides with obj2's right side
    // parametric equation is obj1.left + obj1.vel.x * t = obj2.right + obj2.vel.x * t
    // solving for t: t = (obj1.left - obj2.right) / (obj2.vel.x - obj1.vel.x)
    // we take the minimum because that is when the first sides collided
    t = math.min(t, (obj1.left - obj2.right) / (obj2.vel.x - obj1.vel.x))
    t = math.min(t, (obj1.right - obj2.left) / (obj2.vel.x - obj1.vel.x))// repeat for other sides
    t = math.min(t, (obj1.top - obj2.bottom) / (obj2.vel.y - obj1.vel.y))
    t = math.min(t, (obj1.bottom - obj2.top) / (obj2.vel.y - obj1.vel.y))
}

この時間を使用して、必要に応じてシミュレーション全体を巻き戻すことができます。または、これら 2 つのオブジェクトの状態を確認することもできます。min 関数を使用する代わりに、if ステートメントを使用して、どちらの側が最初に衝突したかを追跡できます。この計算は、そのタイム ステップで衝突する可能性のある複数のオブジェクトを追跡しないことに注意してください。ただし、通常、これは有効な近似値です。また、2 つのオブジェクトが一方の次元では同じ速度で移動し、他方の次元では移動していない場合は、0 で割らないようにする必要があることに注意してください。

于 2013-07-21T03:05:47.320 に答える
0

交差テストは、「完全な」衝突を行う方法ではありません。速度が高いほど、適切なコールバックまたはコールバックの可能性が低くなります。box2d などの物理エンジンを使用するか、独自のエンジンを作成します (推奨されません)。

側面の交差テストでは、衝突したオブジェクトの境界 (長方形) をそれらのサイズと比較して確認できます。

于 2013-07-21T03:00:29.303 に答える