2

私は自分の娯楽のためにいくつかの非常に基本的な物理学を行う方法を学んでいますが、奇妙な問題に遭遇しています.

http://www.lonesock.net/article/verlet.htmlで説明されているように、時間補正されたベルレット統合方法を使用していますが、これまでのところ、かなりうまく機能しています。動きも物も全部いい感じです。

私の問題は、衝突の解決に関して発生します。地形は動かないので、地形に対して解決できます (かなりうまくいくようです)。プレイヤーの現在位置を安全な場所に設定したところ、問題はないようです。しかし、別のスプライト (物理的なアクターなど) に対して解決しようとすると、物事があちこちで発砲するように見えます。

私の解決コードは次のようになります。

void ResolveCollision(Sprite* entity1, Sprite* entity2)
{
    Vec2D depth = GetCollisionDepth(entity1, entity2);
    if (GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
    {
        /* Two physical objects. Move them apart both by half the collision depth. */
        SetPosition(entity1, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity1)), ScalarMultiply(0.5f, depth))));
        SetPosition(entity2, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity2)), ScalarMultiply(-0.5f, depth))));
    }
    else if (GetSpritePhysical(entity1) && !GetSpritePhysical(entity2))
    {
        SetPosition(entity1, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity1)), ScalarMultiply(-1.0f, depth))));
    }
    else if (!GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
    {
        SetPosition(entity2, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity2)), depth)));
    }
    else
    {
        /* Do nothing, why do we have two collidable but nonphysical objects... */
    }
}

ご覧のとおり、衝突したスプライトが物理的なものかどうかによって、3 つのケースがあります。

おそらく、この問題が発生した最初のケ​​ースです。そして、同じ関数を使用して、(一見動作している) 地形衝突にある貫通深度を取得しています。

衝突したスプライトがあちこちに飛んでいくのはなぜですか? 私はこの問題にかなり困惑しています。どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

それらを分離したら、速度/運動量を解決します。どうやってやってるの?

ほとんどの場合、分離する方向を決定するには、それぞれの中心からのベクトルを使用します。貫通が深くなるほど、このベクトル (衝突法線) の精度が低下する可能性があります。これにより、予期しない結果が生じる可能性があります。

うまく機能するのは、それらを分離する必要はなく、移動する前に衝突点がどこにあるかを計算し、その距離だけ移動し、速度を解決し、新しい方向に移動することです。タイムスライスの残りの部分。確かに、それはもう少し複雑ですが、結果はより正確です。

于 2011-04-17T13:19:20.790 に答える