Game Development Reference
In-Depth Information
nates of each craft's center of gravity. In terms of vectors, this is simply the position
vector of one craft minus the position vector of the other.
Once the function has d and r , it needs to determine the actual amount of space, s ,
separating the hovercraft's bounding circles. After this separation is determined, the
function normalizes the vector d . Since the vector d is along the line that separates the
hovercraft's centers of gravity, normalizing it yields the collision normal vector that we
need for our collision response calculations. The collision normal vector is saved in the
global variable vCollisionNormal .
After calculating the collision normal, this function goes on to determine the relative
velocity between the hovercraft. In vector form, this is simply the difference between
the velocity vectors of each craft. Note that the velocity vectors used here must be in
global coordinates, not body-fixed (local) coordinates. Since what's really needed to
determine if a collision is made is the relative normal velocity, the function proceeds to
take the vector dot product of the relative velocity and the collision normal vectors,
saving the result in the variable Vrn .
At this point, all of the calculations are complete, and the only thing left to do is make
the appropriate checks to determine if there is a collision, penetration, or no collision
at all.
The first check is to see if the hovercraft are colliding. We determine this by comparing
the absolute value of the separation between the hovercraft, s , with a distance tolerance,
ctol . If the absolute value of s is less than ctol , a collision might be occurring. The
second requirement is that the relative normal velocity be negative, which implies that
the points of impact on the hovercraft are moving toward each other. If there is a col‐
lision, the function returns a 1 to indicate that collision response is necessary.
If the hovercraft are found not to be colliding, then we perform a second check to see
if they've moved so close together that they are penetrating each other. In this case, if s
is less than -ctol , the hovercraft are penetrating and the function returns a −1 . If the
hovercraft are not colliding and not penetrating, then the function simply returns a 0 ,
indicating that no further action is required.
Before moving on, let's say a word or two about ctol —the collision tolerance distance.
This value is subject to tuning. There's no single value that works well in all cases. You
must consider the overall sizes of the objects potentially colliding, the step size you're
using, and how far the colliding objects are from the viewer while being rendered (i.e.,
their scale). Basically, you should choose a value that makes collisions look correct, so
that on the one hand objects do not appear to be penetrating each other, and on the
other hand you do not report a collision when objects do not appear to be touching at
all.