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] );
}

我修改了一些东西,这样我就不必检查每个球体与其他球体,而只需一次比较一个,这不起作用。

// 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(),在每个球体上仅调用一次。在您修改后的情况下,您computeForce()为每个合作伙伴领域调用一次,并且这些调用中的每一个都调用clearForce(). 我想这就是问题所在。

于 2013-03-16T15:15:07.747 回答