[ODE] Re: nearCallback

Daniel Marbach daniel.marbach at epfl.ch
Sat Nov 13 13:07:24 MST 2004

> What nearCallback do and what can I do with nearCallback?
> The nearCallback is just to calculate the collision?

Refer to the ode user guide, section 10:

Actually I also have some questions about spaces / collisions. Newbies always
ask the same questions - we should improve the doc or put some more advice
somewhere in the Wiki area (since I'm not 100% sure if what I'm doing is right I
can't do that...). My questions:

1. I have several modular robots, each one consisting of dozens of modules. They
are for the moment just on a flat environment (a plane). I
created a 'global' hash space. Then I inserted a hash space for each robot into
this 'global' space. Is that good? Or do you recommend a Quadtree spaces?

2. I have no clue what are good parameters for a multi-resolution hash space
(obviously this depends on the application, but how can I guess what might be
good?) - so far I just created the spaces without setting any levels.

3. What is a good value for the maximum number of contact points in the
nearCallback? I think there was a discussion on this but I don't find it anymore
in the archives. I remember that somebody said that it is good to generate a lot
of contacts (how many exactly? 10? 100?) and to sort them, creating contact
joints only for the most important ones. But which ones are important? Can't I
expect ODE to give me 'important' ones if I request very few (e.g. 3)? If
somebody could post / send me the code of this 'sorting' function that would be
very nice.

4. Is the following nearCallback OK? It should collide everything except for
bodies that are connected by a joint.

void nearCallback(void *data, dGeomID o1, dGeomID o2) {
  if (dGeomIsSpace(o1) || dGeomIsSpace(o2)) {
    // colliding a space with something
    dSpaceCollide2(o1, o2, data, &nearCallback);
    // collide all geoms internal to the space(s)
    if (dGeomIsSpace(o1))
      dSpaceCollide((dSpaceID)o1, data, &nearCallback);
    if (dGeomIsSpace(o2))
      dSpaceCollide((dSpaceID)o2, data, &nearCallback);

  // don't generate contact points if the two bodies are connected by a joint
  } else if (not dAreConnected(dGeomGetBody(o1), dGeomGetBody(o2))) {
    // Maximum number of contact points to generate
    const int N = 10; // ???
    dContact contact[N];
    // n is the number of contact points that has actually been generated
    int n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact));

    for (int i=0; i<n; i++) {
      contact[i].surface.mode = dContactApprox1;
      contact[i].surface.mu = 0.3; // ???
      dJointID c = dJointCreateContact(world, contactGroup, &contact[i]);
      dJointAttach (c, dGeomGetBody(contact[i].geom.g1),

Thanks in advance!


Daniel Marbach
Bitziusstr. 9
CH-3006 Bern

Tel: 031 351 11 09
WWW: http://icwww.epfl.ch/~marbach/

More information about the ODE mailing list