[ODE] Re: nearCallback

Andrzej Szombierski qq at kuku.eu.org
Sat Nov 13 13:24:20 MST 2004


On Sat, 13 Nov 2004, Daniel Marbach wrote:

> 
> 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.

I use something like this:

static bool operator< (const dContact & a, const dContact & b)
{ return a.geom.depth > b.geom.depth; }

[ ... and in near_callback ... ]
const int max_nc = 100;
eContact contact[max_nc];

int nc=dCollide(ga, gb, max_nc, &contact[0].geom, sizeof(eContact));
int max_c = 5;

if(nc > max_c){
	std::nth_element(contact, contact+max_c, contact+nc);
        nc = max_c;
}

for(int i=0;i<nc;i++){ 
	...
}

This requests a lot of contacts (100 was always enough in my case) and 
then uses the "deepest" five (as defined by operator< ). Thanks to 
std::nth_element, it all happens in O(n) time :)

The max_c parameter could be adjusted depending on the geom types - 
sphere<->mesh seems much less demanding than box<->mesh.

-- 
:: Andrzej Szombierski :: qq at kuku.eu.org :: http://kuku.eu.org ::
:: anszom at bezkitu.com  :: radio bez kitu :: http://bezkitu.com ::



More information about the ODE mailing list