[ODE] Bug either in ODE or in implementation (more likely?)

Simon Barratt Barog at pineapple-interactive.com
Thu Mar 17 11:25:24 MST 2005


That'll teach me to not check the actual code, as Adam pointed out
OPCODE does have a closest hit feature. 
you can use the dGeomRaySetClosestHit (dGeomID g, int closestHit) and
the dCollide function you had should return the contact you desired.

Cheers

--
Simon Barratt, Lead Developer, Pineapple Interactive Ltd
e: barog at pineapple-interactive.com
w: http://www.pineapple-interactive.com
t: +44 (0)1274 480185
 

> -----Original Message-----
> From: Simon Barratt 
> Sent: 17 March 2005 10:38
> To: 'ode at q12.org'
> Subject: RE: [ODE] Bug either in ODE or in implementation 
> (more likely?)
> 
> Hi,
> 
> > n = dCollide(o1, o2, 1, &contact, sizeof(contact));
> 
> Your thought was correct, this is just asking for one contact 
> to be returned what you should do is ask for an array, OPCODE 
> returns all the hits with that ray vs trimesh as obviously 
> it's not its job to sort them out for you or deal with them.
> 
> So pass in a larger number of contacts into dCollide (the 
> value 1 is the number of contacts, it's actually a flags 
> value but the mask for number of contacts is 0xffff). Then 
> find the nearest hit from your array of returned 'n' contacts 
> and use that as your ray 't'.
> 
> Good luck
> 
> --
> Simon Barratt, Lead Developer, Pineapple Interactive Ltd
> e: barog at pineapple-interactive.com
> w: http://www.pineapple-interactive.com
> t: +44 (0)1274 480185
>  
> 
> > -----Original Message-----
> > From: ode-bounces at q12.org [mailto:ode-bounces at q12.org] On Behalf Of 
> > Sawyer
> > Sent: 17 March 2005 03:06
> > To: ode at q12.org
> > Subject: [ODE] Bug either in ODE or in implementation (more likely?)
> > 
> > 
> > These are the only two functions that ask ode for collision 
> > information.  Also as far as I can tell gazebo is basically 
> returning 
> > the depth of a random triangle collision depending on what 
> order they 
> > are processed in.  I have not seen problems with any object 
> type other 
> > than trimesh.  Any help is greatly appreciated.
> > 
> > Here is the code block from gazebo dealing with collisions:
> > in file: RayProximity.cc
> > //////////////////////////////////////////////////////////////
> > ////////////////
> > // Update the sensor information
> > void RayProximity::Update()
> > {
> >   int i;
> >   GzPose pose;
> >   RayGeom *ray;
> >   GzVector a, b;
> > 
> >   // Get the pose of the sensor body (global cs)
> >   pose = this->body->GetPose();
> > 
> >   // Reset the ray lengths and mark the geoms as dirty (so they get
> >   // redrawn)
> >   for (i = 0; i < this->rayCount; i++)
> >   {
> >     ray = this->rays[i];
> >     ray->dirty = true;
> >     ray->contactDepth = DBL_MAX;
> >     ray->contactRetro = 0.0;
> >     ray->contactFiducial = -1;
> > 
> >     // Update the ray endpoints (global cs)
> >     a = GzCoordPositionAdd(ray->pos_a, pose.pos, pose.rot);
> >     b = GzCoordPositionAdd(ray->pos_b, pose.pos, pose.rot);
> >     ray->Set(a, GzVectorUnit(GzVectorSub(b, a)));
> >   }
> > 
> >   // Do collision detection
> >   dSpaceCollide2( ( dGeomID ) ( this->superSpaceId ),
> >                   ( dGeomID ) ( this->world->GetSpaceId() ),
> >                   this, &UpdateCallback );
> > 
> >   return;
> > }
> > 
> > //////////////////////////////////////////////////////////////
> > ////////////////
> > // Callback for ray intersection test
> > void RayProximity::UpdateCallback( void *data, dGeomID o1, 
> dGeomID o2 
> > ) {
> >   int n;
> >   dContactGeom contact;
> >   Geom *geom1, *geom2;
> >   RayGeom *rayGeom;
> >   Geom *hitGeom;
> >   RayProximity *self;
> > 
> >   self = (RayProximity*) data;
> > 
> >   // Check space
> >   if ( dGeomIsSpace( o1 ) || dGeomIsSpace( o2 ) )
> >   {
> >     if (dGeomGetSpace(o1) == self->superSpaceId ||
> > dGeomGetSpace(o2) ==
> > self->superSpaceId)
> >     {
> >       dSpaceCollide2( o1, o2, self, &UpdateCallback );
> >     }
> >     if (dGeomGetSpace(o1) == self->raySpaceId || 
> dGeomGetSpace(o2) ==
> > self->raySpaceId)
> >     {
> >       dSpaceCollide2( o1, o2, self, &UpdateCallback );
> >     }
> >   }
> >   else
> >   {
> >     geom1 = NULL;
> >     geom2 = NULL;
> > 
> >     // Get pointers to the underlying geoms
> >     if (dGeomGetClass(o1) == dGeomTransformClass)
> >       geom1 = (Geom*) dGeomGetData(dGeomTransformGetGeom(o1));
> >     else
> >       geom1 = (Geom*) dGeomGetData(o1);
> > 
> >     if (dGeomGetClass(o2) == dGeomTransformClass)
> >       geom2 = (Geom*) dGeomGetData(dGeomTransformGetGeom(o2));
> >     else
> >       geom2 = (Geom*) dGeomGetData(o2);
> > 
> >     assert(geom1 && geom2);
> > 
> >     rayGeom = NULL;
> >     hitGeom = NULL;
> > 
> >     // Figure out which one is a ray; note that this assumes
> >     // that the ODE dRayClass is used *soley* by the RayGeom.
> >     if (dGeomGetClass(o1) == dRayClass)
> >     {
> >       rayGeom = (RayGeom*) geom1;
> >       hitGeom = geom2;
> >     }
> > 
> >     if (dGeomGetClass(o2) == dRayClass)
> >     {
> >       assert(rayGeom == NULL);
> >       rayGeom = (RayGeom*) geom2;
> >       hitGeom = geom1;
> >     }
> > 
> >     // Check for ray/geom intersections
> >     if ( rayGeom && hitGeom )
> >     {
> >       n = dCollide(o1, o2, 1, &contact, sizeof(contact));
> >       if ( n > 0 )
> >       {
> >         if (contact.depth < rayGeom->contactDepth)
> >         {
> >           //printf("%p %p %f \n", o1, o2, contact.depth);
> >           rayGeom->contactDepth = contact.depth;
> >           rayGeom->contactRetro = hitGeom->GetRetro();
> >           rayGeom->contactFiducial = hitGeom->GetFiducial();
> >         }
> >       }
> >     }
> >   }
> >   return;
> > }
> > 
> > Thanks again,
> > Sawyer Larkin
> > 
> > _______________________________________________
> > ODE mailing list
> > ODE at q12.org
> > http://q12.org/mailman/listinfo/ode
> > 
> > 
> > 
> > 





More information about the ODE mailing list