[ODE] Convex Volume Geom (GJK)
jstier@cs.uvic.ca
jstier at cs.uvic.ca
Wed Dec 21 13:38:06 MST 2005
I am curious about Convex Hull collision detection. What
are its advantages ? Is it faster ? Could you point me
to some reading material ...
Cheers and Happy Holidays
Jochen
Quoting Rodrigo Hernandez <kwizatz at aeongames.com>:
> ode at erwincoumans.com wrote:
>
> >Rodrigo,
> >
> >I'm interested in your solution for convex for ODE. Can you describe the
> >algorithms you use to compute the contact points?
> >
> >Thanks,
> >Erwin
> >
> >
> Well, Like I said before, I have convex-plane and convex-sphere already
> coded, so I can descrive those.
> First some context,
>
> Convex shapes are defined in my implementation in a somewhat redundant
> way, a convex shape consists of the collection
> of planes describing a convex hull, each plane is a dVector4 containing
> the plane equation (X,Y,Z represents the normal of the plane and W the
> signed distance from the origin),
> then there is a collection of points describing the hull, simple
> dVector3 variables, and finally an index buffer to assign the points to
> the planes in a counter-clockwise manner,
> this buffer is an int array, arranged in the following way: first the
> number of points in a face (poligon), then that many indexes into the
> point collection, then the sequence is repeated,
> the first group of indices matches the first plane, and so on.
>
> ODE takes pointers to all these structures, ODE does NOT allocate any of
> that memory, I made it this way because I think that that information is
> needed by a rendering engine or similar,
> so it must be computed and allocated in the "client" application anyway,
> so ODE can simply reuse the data.
>
> Here us the dxConvex Class definition:
>
> struct dxConvex : public dxGeom
> {
> dReal *planes; /*!< An array of planes in the form:
> normal X, normal Y, normal Z,Distance
> */
> dReal *points; /*!< An array of points X,Y,Z */
> unsigned int *polygons; /*! An array of indices to the points of each
> polygon, it should be the number of vertices followed by that amount of
> indices to "points" in counter clockwise order*/
> unsigned int planecount; /*!< Amount of planes in planes */
> unsigned int pointcount;/*!< Amount of points in points */
> dReal saabb[6];/*!< Static AABB */
> dxConvex(dSpaceID space,
> dReal *planes,
> unsigned int planecount,
> dReal *points,
> unsigned int pointcount,
> unsigned int *polygons);
> ~dxConvex()
> {
> //fprintf(stdout,"dxConvex Destroy\n");
> }
> void computeAABB();
> };
>
> And here is the Sample Data I am using for my tests, the following
> describes a cube, in case it is not obvious :)
>
> dReal planes[]= // planes for a cube
> {
> 1.0f ,0.0f ,0.0f ,0.25f,
> 0.0f ,1.0f ,0.0f ,0.25f,
> 0.0f ,0.0f ,1.0f ,0.25f,
> 0.0f ,0.0f ,-1.0f,0.25f,
> 0.0f ,-1.0f,0.0f ,0.25f,
> -1.0f,0.0f ,0.0f ,0.25f
> };
> const unsigned int planecount=6;
>
> dReal points[]= // points for a cube
> {
> 0.25f,0.25f,0.25f, // point 0
> -0.25f,0.25f,0.25f, // point 1
>
> 0.25f,-0.25f,0.25f, // point 2
> -0.25f,-0.25f,0.25f,// point 3
>
> 0.25f,0.25f,-0.25f, // point 4
> -0.25f,0.25f,-0.25f,// point 5
>
> 0.25f,-0.25f,-0.25f,// point 6
> -0.25f,-0.25f,-0.25f,// point 7
> };
> const unsigned int pointcount=8;
> unsigned int polygons[] = //Polygons for a cube (6 squares)
> {
> 4,0,2,6,4, // positive X
> 4,1,0,4,5, // positive Y
> 4,0,1,3,2, // positive Z
> 4,3,1,5,7, // negative X
> 4,2,3,7,6, // negative Y
> 4,5,4,6,7, // negative Z
> };
>
>
> Ok, now the algorithms,
>
> Plane-Convex is done by simply separating the points in two groups, the
> ones in front of the plane and the ones behind the plane, if all of them
> are on either side, there is no collision, if there are points on
> both sides, there is a collision, take the ones BEHIND the plane and use
> them as Contact Points, the contact normal is the Plane normal for all
> of them, and the depth is the distance from the plane to each of the points.
>
> Sphere-Convex is a bit more complicated, but not much. you just iterate
> thru the planes first, checking if the sphere intersects the plane (if
> the distance from the center of the shere to the plane is less
> than the radius of the sphere, it intersects) if it does, find the point
> on the plane closer to the center of the sphere, and check if said point
> is inside the polygon descrived on the plane (face), if it is,
> the contact point is the point in the sphere surface in the direction of
> the point on the plane, the depth is the radius of the sphere minus the
> distance to the plane and the collision normal is the normal of the face.
> IF the point is NOT inside the polygon, then we need to check for
> collision with a vertex or edge, so find the Voronoy region of the
> polygon on which the point resides and check for collision between the
> sphere and the closest feature that gives you (vertex or edge) if there
> is a collision then the collision position is the point on the sphere
> surface in direction (point_in_edge or vertex)-sphere_center, the depth
> is the radius of the sphere minus the distance to the point in the
> feature and the normal is the normalized vector
> sphere_center-(point_in_edge or vertex).
>
> I think I invented the sphere-convex collision check (I have a contiuous
> one as well), but it may just be a form of Lin-Canny or V-Clip, but I am
> not sure, I wrote all that by memory, so some details may not be 100%
> acurate.
>
> Cheers!
> _______________________________________________
> ODE mailing list
> ODE at q12.org
> http://q12.org/mailman/listinfo/ode
>
----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.
More information about the ODE
mailing list