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
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”
Leave a Reply Cancel reply
This site uses Akismet to reduce spam. Learn how your comment data is processed.
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).”
?
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?
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.”?
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.