Help end child hunger

Ray-Sphere Intersection

 
Prev: Plane Next: Ray-Triangle Intersection
 

Given a ray, defined by a point and a unit vector, and a sphere do they intersect? If so where? Do they intersect in a single point, or in two points? In the figure below we can see several possibilities.

The first question is whether the ray intersects the sphere or not. In order to find out, the distance between the center of the sphere and the ray must be computed. If that distance is larger than the radius of the sphere then there is no intersection.

To compute the distance two cases are considered: either the center of the sphere projects on the ray, or it doesn’t. A simple dot product will do the trick.

Let v be the vector that goes from p to c (the center of the sphere). Then if

  • d . v > 0 // the distance to the ray can be computed (Sphere 1)
  • d . v <= 0 // the sphere is behind the ray (Sphere 2)
  •  

    Case 1: The center of the sphere projects on the ray

    The following figure shows the three possible cases: no intersection (sphere A), single intersection (sphere B), and two intersections (sphere C).

    First compute the projection of the center of the sphere on the ray. Let pc be that projection.

    If the distance from pc to the ray is greater than the ray then there is no intersection (sphere A in the above figure).

    If the distance from pc to the ray is equal to the radius of the sphere, then the intersection is a single point: pc (sphere B).

    The former case requires a little bit extra work.

    The point pc has already been found. So the task at hand is to find i1 and/or i2. The following procedure gives us i1, and finding i2 is left as an (easy) exercise to the reader.

    If the distance from p to i1 is known, lets called di1, then finding i1 is achieved with the following equation:

        	i1 = p + d * di1

    Hence all there is left to do is to find di1.

    The triangle defined by i1, pc and c is a right triangle (i.e. on of the angles is 90 degrees), hence the Pythagorean theorem applies. Let

            a = |c - i1| = radius
    	b = |pc - c|
    	c = |pc - i1|

    The only unknown is c, and it can be computed as:

    	c^2 = a^2 - b^2

    Then

    	di1 = | pc - p | - c

    The previous computation of di1 assumed that the origin of the ray was not inside the sphere. If p is inside the sphere then the computation of di1 is slightly different:

    	di1 = | pc - p | + c

    Case 2: The center of the sphere is behind the ray

    If it is assumed that the origin of the ray is outside the sphere then there is no possible intersection. Otherwise, there is an intersection if the distance from p to c is less than or equal to the radius. If is equal then the intersection is the point p itself.

    If the origin of the ray is inside the sphere a similar reasoning to the case presented previously may be applied. Note that the projection is done on the line, and not on the ray. The following figure shows the relevant points involved.

    Computing the distance from pc to i1 is exactly the same as before. Let dist be that distance. The value of di1 can be computed as:

    	di1 = dist - | pc - p |

    Algorithm

    So here it is the full algorithm to compute the intersection between a ray and a sphere. It is assumed that the ray is defined by an origin p, and a direction d (unit vector), and that the sphere has a center c, and a radius r.

     
    vpc = c - p  // this is the vector from p to c
    
    if ((vpc . d) < 0) // when the sphere is behind the origin p
                        // note that this case may be dismissed if it is 
                        // considered that p is outside the sphere 	
            if (|vpc| > r) 
    
                       // there is no intersection
    
    	else if (|vpc| == r)
    
    		intersection = p
    
    	else // occurs when p is inside the sphere
    
    		pc = projection of c on the line
                    // distance from pc to i1
    		dist = sqrt(radius^2 - |pc - c|^2)
    		di1 = dist - |pc - p|
    		intersection = p + d * di1
    
    else // center of sphere projects on the ray
    
    	pc = projection of c on the line
    	if (| c - pc | > r)
    
    		// there is no intersection
    
    	else 
                    // distance from pc to i1
    		dist = sqrt(radius^2 - |pc - c|^2)
    
          		if (|vpc| > r) // origin is outside sphere	
    
    			di1 = |pc - p| - dist 
    
    		else // origin is inside sphere
    
    			di1 = |pc - p| + dist 
    
    		intersection = p + d * di1

     

    Prev: Plane Next: Ray-Triangle Intersection
     

      5 Responses to “Ray-Sphere Intersection”

    1. Thanks for the tutorial, very simple and easy to understand.

      Small correction, when you say:
      “If the distance from pc to the ray is greater than the ray then there is no intersection (sphere A in the above figure).”

      Shouldn’t it be:
      “If the distance from pc to the ray is greater than the radius of the sphere then there is no intersection (sphere A in the above figure).”

      ?

    2. For the case where you have two intersections of the sphere
      to the line: If the angle at c-pc to the line denoted by
      p->d is always 90 degrees, then isn’t the distance from i1
      to pc always identical to the distance from pc to i2?

    3. Not sure what you mean by this: “If the distance from pc to the ray is greater than the ray then there is no intersection.”

      Did you perhaps mean “If the distance from pc to the center of the sphere is greater than the radius then there is no intersection.”?

    4. Everything is good, and the tutorial is perfect except for the projected point on the line

      pc you never say how to calculate it and without it the algoritm cant be used

      • Hi Jakob,

        Thanks for the feedback. pc is the projection of the center of the sphere on the ray segment. There is a link in the text to the page that describes the projection operation, that’s why I didn’t mention it in here.

    Leave a Reply

    This site uses Akismet to reduce spam. Learn how your comment data is processed.

    %d bloggers like this: