私はいくつかの基本的な衝突検出の宿題に取り組んでいます。半径、位置、速度などのメンバーを持つ一連の球体オブジェクトを含むベクトルがあります。問題を次のコードに絞り込みました。
これは私が与えられたコードです。ベクトル球の各球について、ベクトル球の他のすべての球の衝突をチェックします。
// 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 を使用してこれを試してみましたが、結果として同じ動作が得られました。