1

私はいくつかの基本的な衝突検出の宿題に取り組んでいます。半径、位置、速度などのメンバーを持つ一連の球体オブジェクトを含むベクトルがあります。問題を次のコードに絞り込みました。

これは私が与えられたコードです。ベクトル球の各球について、ベクトル球の他のすべての球の衝突をチェックします。

// Do the physics simulation
for ( unsigned int i = 0; i < spheres.size(); i++ )
{   
    spheres[i].computeForces(gravity, air_friction, walls, spheres);
}

これはこの関数を参照します: (最後の引数は球のベクトルです)

// Compute all the forces between a sphere and the walls and other spheres and gravity and drag.
void computeForces(Vec3d gravity, double dragConstant, plane walls[6], std::vector< sphere > & spheres)
{
    clearForce();
    accumulateGravity( gravity );
    accumulateDrag( dragConstant );
    // Now check for collisions with the box walls
    for ( int j = 0; j < 6; j++ )
        accumulatePlaneContact(walls[j]);

    //Check for collisions with external spheres in the environment
    for ( unsigned int j = 0; j < spheres.size(); j++ )
        if ( this != &spheres[j] ) // Don't collide with yourself
            accumulateSphereContact( spheres[j] );
}

すべての球体を他の球体と比較する必要がないように変更しましたが、一度に 1 つずつ比較するだけで、これは機能しません。

// Do the physics simulation
for ( unsigned int i = 0; i < spheres.size(); i++ )
{
            //Here I can choose which spheres to test
    for (unsigned int j = 0; j < spheres.size(); j++)
    {
    spheres[i].computeForce(gravity, air_friction, walls, spheres[j]);
    }
}

この関数では: (最後の引数は単一の球体です)

void computeForce(Vec3d gravity, double dragConstant, plane walls[6], sphere & s)
{
    clearForce();
    accumulateGravity( gravity );
    accumulateDrag( dragConstant );
    for ( int j = 0; j < 6; j++ )
    {
        accumulatePlaneContact(walls[j]);
    }
    if (this != &s)
    {
        accumulateSphereContact(s);
    }
}

デバッグ モードで実行すると、正常に実行され、すべての関数を正しく入力して計算を実行しているように見えますが、力が実際には球体オブジェクトに保存されていないようです。お互いを通り抜ける球体を取得します。(壁との衝突、重力、ドラッグはすべて正常に機能します)。

違いは何ですか?私の最初の推測は、それが関係しているということです。また、ベクトルの代わりに unordered_map を使用してこれを試してみましたが、結果として同じ動作が得られました。

4

1 に答える 1

1

computeForces()最初のケースでは、 への呼び出しを含む がclearForce()各球体で 1 回だけ呼び出されたことに注意してください。変更されたケースではcomputeForce()、各パートナー球体に対して 1 回呼び出しており、これらの呼び出しのそれぞれがclearForce(). それが問題だと思います。

于 2013-03-16T15:15:07.747 に答える