Jump to content
  • Advertisement
Sign in to follow this  
Spa8nky

[Solved] Penetration depth for sphere/AABB and sphere/OBB intersection correct but...

This topic is 3128 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello again, apologies for what may seem like a sudden influx of questions but this one had me curious. I have two working collision detection test for a sphere. One is for an AABB:
        private bool TestSphereAABB(CD_AxisAlignedBoundingBox aABB, ref Contact contact)
        {
            // Find point (p) on AABB closest to Sphere centre
            Vector3 p = aABB.ClosestPtPointAABB(Centre);

            // Sphere and AABB intersect if the (squared) distance from sphere centre to point (p)
            // is less than the (squared) sphere radius
            Vector3 v = p - Centre;
            
            float distance_Squared = Vector3.Dot(v, v);

            if (distance_Squared <= Radius * Radius)
            {
                if (v != Vector3.Zero)
                {
                    v.Normalize();
                }

                contact.normal = v;
                contact.penetration = aABB.DistPointAABB(Centre) - Radius;

                return true;
            }

            // No intersection
            return false;
        }


The other (very similar) is for an OBB:
        private bool TestSphereOBB(CD_OrientedBoundingBox oBB, ref Contact contact)
        {
            // Find point (p) on OBB closest to Sphere centre
            Vector3 p = oBB.ClosestPtPointOBB(Centre);

            // Sphere and OBB intersect if the (squared) distance from sphere centre to point (p)
            // is less than the (squared) sphere radius
            Vector3 v = p - Centre;

            // Vector3.Dot(v, v) gives the square distance to point p
            float distance_Squared = Vector3.Dot(v, v);
            
            if (distance_Squared <= Radius * Radius)
            {
                if (v != Vector3.Zero)
                {
                    v.Normalize();
                }

                contact.normal = v;
                contact.penetration = (float)Math.Sqrt(oBB.SqDistancePoint(Centre)) - Radius;

                return true;
            }

            // No intersection
            return false;
        }


If I have the usual sliding response collision resolution of: position_Projected += contact.normal * contact.penetration; then everything works fine. However, in both cases the collision normal is in the opposite direction to what it should be. How can I achieve a correct penetration depth with the normal reversed (-v)? Also, am I making things too complicated when trying to work out the penetration depth? Thank you. EDIT: Solved it, I just need to use: Radius - (float)Math.Sqrt(distance_Squared); for all cases. Please excuse my brain. [Edited by - Spa8nky on November 1, 2009 3:51:42 PM]

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!