0

私が作っている単純なゲームに衝突検出を実装しようとしています。私は周りを見回しましたが、すべてが私の距離のために行った方程式に戻ってきました。しかし、それはうまくいきません。何か不足していますか?それとも私は完全に間違っていますか?

bool collisionquery(enemy z){ 
    double dist = sqrt((px - z.getpx()) * (px - z.getpx()) +
                       (py - z.getpy()) * (py - z.getpy()) +
                       (pz - z.getpz()) * (pz - z.getpz()));

    if (dist < 0.1*getbulletsize())
    {
        cout << "hit\n";
        return true;
    }
    return false;
}
4

2 に答える 2

1

このコードが機能しないシナリオは何ですか? このアルゴリズムは機能すると思います (2 つのオブジェクト間の距離がその半径よりも小さいことを検出する) また、速度の大きいオブジェクトに遭遇すると、重大な不正確さが生じる可能性があります。

発生する可能性のある問題は、衝突がフレーム中ではなくアニメーション フレームの最後にのみ発生すると想定しているため、衝突の時間を正確に判断できないことです。アニメーション フレームは、速度が 0 -> 1 の間で一定であると仮定します。ここで、加速度は既に V の計算に使用されています。

簡単にするために、両方の物体を半径 R1 と R2 の球として近似することをお勧めします。

この場合、次のことを説明する必要があります。

1 - 2 つのボディの半径。この場合、敵は半径 0 のポイントになり、弾丸の半径は getBulletSize(); になります。

2 - アニメーション フレーム中の弾丸と敵の速度は 0<=t<=1 です。

衝突のケースは |r1 + r2| のときに発生します。< d、ここで、d は両方の物体の重心間の距離です。

d は P(t) - Q(t) として与えられ、Q と P は両方のオブジェクトの重心です。P(t) = P0 + Vp*t. Q(t) = Q0 + Vq*t.

Vp = P1 - P0; Vq = Q1 - Q0;

=> d = P(t) - Q(t)

(R1 + R2)^2 = (P(t) - Q(t))^2 の場合を解くと、衝突の時間が生成されます。この公式を恐れないでください!これは単純な 2 次多項式に解決され、その 2 次式が t について解決されます。式で B^2 > 0 の場合、時間が最小のときに最初の面衝突が発生します!

衝突事例:

次の場合に発生します。

1) 0 <= t <= 1。

予備チェック:

2) 最小 d (半径条件の導関数 = 0) は < R1 + R2 でなければなりません

お役に立てれば!!!私があなたを誤解していたり​​、意味不明なことを話している場合はお知らせください:)

于 2013-02-25T23:20:40.287 に答える
0

dist の比較が小さすぎて、気が付きませんでした。ありがとう。

于 2012-12-01T17:03:51.340 に答える