| |
|
|
||||
![]() |
||||||
| |
|
|||||
|
Simple Intersection Tests For Games
Whether it's your car crossing the finish line at 180 miles per hour, or a bullet tearing through the chest of your best friend, all games make use of collision detection for object interaction. This article describes some simple intersection tests for the most useful shapes: spheres and boxes. Sweep Tests for Moving Objects A common approach to collision detection is to simply test for whether two objects are overlapping at the end of each frame. The problem with this method is that quickly moving objects can pass through each other without detection. To avoid this problem, their trajectories can be subdivided and the objects checked for overlap at each point; however, this gets expensive if either object experienced a large displacement. On the other hand, a sweep test can efficiently determine a lower and upper bound for the time of overlap, which can then be used as more optimal starting points for the subdivision algorithm. A Sphere-Plane Sweep Test Figure 1 shows an example of a quickly moving sphere passing through a plane. It can be seen that C0 is on the positive side of the plane and C1 is on its negative side.
In general, if a sphere penetrated a plane at some point during the frame, then d0>r and d1<r, where r is the radius of the sphere and d0 and d1 are the signed distances from the plane to C0 and C1, respectively. The signed distance from a point C to a plane can be calculated with the formula
More efficiently, we can store the plane in the form {n, D}, where
The distance d is then calculated
The trajectory from C0 to C1 can be parameterized with a variable u, which may be thought of as normalized time, since its value is 0 at C0 and 1 at C1. The normalized time at which the sphere first intersects the plane is given by
The center of the sphere at this time can then be interpolated with an affine combination of C0 and C1
This formula interpolates Ci correctly as long as d0 is not equal to d1 (which is the case if displacement has occurred), even when r = 0 (the case of a line segment). If desired, the parameter u can also be used to linearly interpolate the orientation of an object at this point. In this example, it was assumed that the sphere approached the plane from the positive side and that the sphere was not already penetrating the plane at C0.. In the case that there could have been penetration on the previous frame, the condition |d0|<=r should also be checked. Listing 1 gives an implementation of this sphere-plane sweep test. Listing 1. A sphere-plane sweep test. #include "vector.h" class PLANE {
public:
}; const bool SpherePlaneSweep ) { const SCALAR d0
= plane.distanceToPoint( C0 ); //check if
it was touching on previous frame {
Ci = C0; } //check if
the sphere penetrated during this frame
u = (d0-r)/(d0-d1); //normalized time } return false; } For the definition of the VECTOR class, please see [3]. |
|
|