[ODE] (Second Try) Problem with contact joints

Rodrigo Hernandez kwizatz at aeongames.com
Fri Mar 18 08:50:48 MST 2005


Hi,
Well, I tried to set the step to a smaller amount, my max contacts is 
40, but dCollide returns only one collision, still no change at runtime, 
the sphere just passes through.

I am going to try tracing into ODE's dWorldStep function and find 
whether or not the contact makes any difference, so what is the function 
that applies contact forces? what should I be looking for?

Here is the code for the simloop and the near callback I am using just 
in case.
The Near callback is an object static function, in case you're wondering:

void CWorld::OnPrepare()
{
    dSpaceCollide(ODESpace,0,&ODENearCallback);
    dWorldStep(ODEWorld,0.01);
    dJointGroupEmpty(ODEContactGroup);
}

void CWorld::ODENearCallback (void *data, dGeomID o1, dGeomID o2)
{
 CWorld *World=CWorld::GetWorld();
  // exit without doing anything if the two bodies are connected by a joint
  dBodyID b1 = dGeomGetBody(o1);
  dBodyID b2 = dGeomGetBody(o2);
  if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) return;

  dContact contact[40];   // up to MAX_CONTACTS contacts per box-box
  for (int i=0; i<40; i++)
  {
    contact[i].surface.mode = dContactBounce | dContactSoftCFM;
    contact[i].surface.mu = dInfinity;
    contact[i].surface.mu2 = 0;
    contact[i].surface.bounce = 1.0f;
    contact[i].surface.bounce_vel = 0.0f;
    contact[i].surface.soft_cfm = 0.01f;
  }
  if (int numc = dCollide (o1,o2,40,&contact[0].geom,sizeof(dContact)))
  {
    for (int i=0; i<numc; ++i)
    {
        dWorldID world = World->GetODEWorld();
        dJointGroupID cg=World->GetODEContactGroup();
        dJointID c = dJointCreateContact (world,cg,&contact[i]);
        dJointAttach(c,b1,b2);
    }
  }
}

Thanks for looking :).


More information about the ODE mailing list