I tried making a simple demo and it doesn't work either.
- Code: Select all
NewtonWorld* const world = scene->GetNewton();
// make a compound from 2 adjacent unit cubes
NewtonCollision* const compound = NewtonCreateCompoundCollision (world, 0);
NewtonCompoundCollisionBeginAddRemove(compound);
dMatrix offsetA (GetIdentityMatrix());
offsetA.m_posit = dVector(.5f, 0.0f, 0.0f); // shift to +X
NewtonCollision* const collisionA = NewtonCreateBox (world, 1.0f, 1.0f, 1.0f, 0, &offsetA[0][0]);
NewtonCompoundCollisionAddSubCollision (compound, collisionA);
NewtonDestroyCollision(collisionA);
dMatrix offsetB (GetIdentityMatrix());
offsetB.m_posit = dVector(-0.5f, 0.0f, 0.0f); // shift to -X
NewtonCollision* const collisionB = NewtonCreateBox (world, 1.0f, 1.0f, 1.0f, 0, &offsetB[0][0]);
NewtonCompoundCollisionAddSubCollision (compound, collisionB);
NewtonDestroyCollision(collisionB);
NewtonCompoundCollisionEndAddRemove(compound);
// make a centered unit cube
dMatrix matrixC (GetIdentityMatrix());
NewtonCollision* const collisionC= NewtonCreateBox (world, 1.0f, 1.0f, 1.0f, 0, &matrixC[0][0]);
// place compound and unit cube at the origin and test for intersection
dMatrix poseA (GetIdentityMatrix());
dMatrix poseB (GetIdentityMatrix());
if( NewtonCollisionIntersectionTest(world,compound, &poseA[0][0], collisionC, &poseB[0][0],0) )
{
// intersect
}
I stepped through the code in Newton and wonder if the problem is on line 493 in dgNarrowPhaseCollision.cpp
"return (pair.m_contactCount == -1) ? true : false; "
When using a compound, pair.m_contactCount always seems to be the number of sub collision objects in the compound so it will always fail that test. In the above example, pair.m_contactCount is -2.
-Bird