For my test case I have a sphere sliding across a horizontal plane that will eventually come in contact with a vertical plane. I have figured out the correct way to deal with a moving sphere to plane for either sliding to resting contact or bouncing off of it. However, it was always with only one rigid body object to one static collision. Now there are two static collision objects. The way the static collisions are added are 1) Vertical plane 2) Horizontal plane. As a result it find the collision with the horizontal plane to slide across it (index 1) but it will find collision with the vertical plane (index 0) once it reaches it. With the logic I have below, it will never consider the collision with the vertical plane. How should I ensure that it will respond to collision with it?
float fAccumulator = 0.0f;
while(fAccumulator < fElapsedTime && mRigidBodyObjects.size() > 0)
{
F32 left_time = fElapsedTime - fAccumulator;
for(unsigned int i = 0; i < mRigidBodyObjects.size(); ++i)
{
int j1 = -1;
RigidBodyCollisionResult crFirstCollisionResult;
crFirstCollisionResult.fCollisionTime = FLT_MAX;
RigidBodyCollisionResult crCollisionResult;
for(unsigned int j = 0; j < mStaticObjects.size(); ++j)
{
crCollisionResult = mRigidBodySolver.Collide(mRigidBodyObjects[i], mStaticObjects[j], left_time);
if(crCollisionResult.enCollisionState == WILL_COLLIDE)
{
if(crCollisionResult.fCollisionTime <= crFirstCollisionResult.fCollisionTime)
{
crFirstCollisionResult = crCollisionResult;
j1 = j;
}
}
else if(crCollisionResult.enCollisionState == HAS_COLLISION || crCollisionResult.enCollisionState == RESTING_CONTACT)
{
crFirstCollisionResult = crCollisionResult;
j1 = j;
}
}
if(crCollisionResult.enCollisionState == WILL_COLLIDE || crCollisionResult.enCollisionState == NO_COLLISION) {
mRigidBodyObjects[i]->ApplyGravity();
}
if(j1 != -1)
{
if(crFirstCollisionResult.enCollisionState == WILL_COLLIDE && crFirstCollisionResult.fCollisionTime <= fElapsedTime)
{
mRigidBodyObjects[i]->Update(crFirstCollisionResult.fCollisionTime);
mRigidBodySolver.HandleCollisionReponse(mRigidBodyObjects[i], mStaticObjects[j1], crFirstCollisionResult, crFirstCollisionResult.fCollisionTime);
fAccumulator += crFirstCollisionResult.fCollisionTime;
}
else if(crFirstCollisionResult.enCollisionState == HAS_COLLISION || crFirstCollisionResult.enCollisionState == RESTING_CONTACT)
{
mRigidBodySolver.HandleCollisionReponse(mRigidBodyObjects[i], mStaticObjects[j1], crFirstCollisionResult, left_time);
mRigidBodyObjects[i]->Update(left_time);
fAccumulator += left_time;
}
else
{
mRigidBodySolver.HandleCollisionReponse(mRigidBodyObjects[i], mStaticObjects[j1], crFirstCollisionResult, left_time);
mRigidBodyObjects[i]->Update(left_time);
fAccumulator += left_time;
}
}
else
{
mRigidBodyObjects[i]->Update(left_time);
fAccumulator = fElapsedTime;
}
}
}