Sign in to follow this  

Why does one penetration depth work and the other doesn't in this case?

This topic is 2955 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, Here is an intersection test for a bounding sphere against a tube:
        private bool TestSphereTube(CD_Segment segment, float radius, ref Contact contact)
        {
            // Find the distance between the object and the nearest point on the segment
            float distance_Squared = segment.SquareDistanceToPoint(Centre);
            distance_Squared += Radius;

            // If the object is outside the radius (> instead of >= means I don't have to use an Epsilon)
            if (distance_Squared > (radius * radius))
            {
                // Compute the closest point on the segement to the projected position
                Vector3 point = segment.ClosestPtPointSegment(Centre);

                // Calculate the normal based on the closest point on segment to object's position
                Vector3 normal = point - Centre;
                normal.Normalize();

                contact.normal = normal;
                contact.penetration = (float)Math.Sqrt(distance_Squared) - radius;

                return true;
            }

            return false;
        }

For the collision response I have the following: position_Projected += contact.normal * contact.penetration; What I don't understand is that if I change the penetration to the following (avoiding the use of a square root): contact.penetration = distance_Squared - (radius * radius); then the collision response jerks sporadically! What is going on here? Thank you.

Share this post


Link to post
Share on other sites
Because the difference between 2 numbers is not the same as the difference between the squares of those numbers.

5 - 2 = 3
(5*5) - (2*2) = 25 - 4 = 21

The square root turns the two numbers from a quadratic scale back into a linear scale. You need it. The square root does take lot of time compared to say 1 addition, but just making less tests is by far the better way to optimize. Unless your doing Crytek 3, you probably don't need to remove square roots - just pick a better culling system. Not checking something is infinitely faster than a fast check :)


Note: I'm assuming your trying this because the profiler told you your code was slow? You wouldn't be trying to prematurely optimize would you? :D

Share this post


Link to post
Share on other sites

This topic is 2955 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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this