[ODE] Ray queries with GIMPACT.
Michael Anderson
christiancoder at gmail.com
Tue Apr 24 13:16:35 MST 2007
Hmmm, looks like it's a vertex winding issue. If I flip the vertex winding
ray - mesh tests work, but everything else fails...
On 4/24/07, Michael Anderson <christiancoder at gmail.com> wrote:
>
> Lately we have been experiencing capsule - mesh jitter with OPCODE. After
> reading that GIMPACT seems to solve these collision problems I made the
> switch. After adding dInitODE and dCloseODE to our application I was up and
> running. GIMPACT appears to have solved the jitter problem, but I have lost
> ray - mesh intersections. Our ray cast method follows, it basically takes a
> global ray (that does not belong to any collision space) and calls dCollide
> passing in our collision space as the second geom. Does GIMPACT support ray
> - mesh (in my experience this is the easiest of all intersection tests)? If
> so what am I missing?
>
>
> //=============================================================================
>
> bool castRay( RayCastResult& result, const VectorF& start, const VectorF&
> end, const U32 types )
> {
> // Calc direction and length of ray.
> VectorF dir = end - start;
> F32 const len = dir.len();
> dir *= (1.0f / len);
>
> // Create ray.
> dGeomRaySetLength( gRayId, len );
> dGeomRaySet( gRayId, start.x, start.y, start.z, dir.x , dir.y, dir.z );
>
> // Set collide bits for ray.
> dGeomSetCollideBits( gRayId, types );
>
> // Collide ray with world.
> dContactGeom contacts[64];
> const int c = dCollide( gRayId, (dGeomID)gSpace, 64, contacts, sizeof(
> dContactGeom ) );
>
> // Did ray intersect world?
> if (!c)
> {
> return false;
> }
>
> // Find the closest intersection.
> U32 closest = 0;
> F32 closestDepth = contacts[0].depth;
> for (U32 i = 1; i < c; i++)
> {
> if (contacts[i].depth < closestDepth)
> {
> closest = i;
> closestDepth = contacts[i].depth;
> }
> }
>
> // Ray intersected world, so get intersection info.
> dContactGeom& closestContact = contacts[closest];
> result.object = (SceneObject*)dGeomGetData( closestContact.g2 );
> result.geom = closestContact.g2;
> result.entityType = dGeomGetCategoryBits( closestContact.g2 );
> result.point.set( closestContact.pos[0], closestContact.pos[1],
> closestContact.pos[2] );
> result.normal.set( closestContact.normal[0], closestContact.normal[1],
> closestContact.normal[2] );
> result.distance = closestContact.depth;
>
> return true;
> }
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ode.org/pipermail/ode/attachments/20070424/a3267f25/attachment.htm
More information about the ODE
mailing list