我正在做一些基本的碰撞检测作业。我有一个向量,其中包含一堆具有半径、位置、速度等成员的球体对象。我已将问题缩小到以下代码。
这是我得到的有效代码。对于矢量球体中的每个球体,它会检查矢量球体中的所有其他球体是否发生碰撞。
// 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 而不是具有相同结果行为的向量。