Game Development Reference
In-Depth Information
// Create the contact - it has a normal in the plane direction.
Contact* contact = data->contacts;
contact->contactNormal = normal;
contact->penetration = penetration;
contact->contactPoint = position - plane.direction * centerDistance;
// Write the appropriate data.
contact->body[0] = sphere.body;
contact->body[1] = NULL;
contact->restitution = data->restitution;
contact->friction = data->friction;
return 1;
}
Both are implemented on the CD, but only the half-space is used in any of the demos.
13.3.3
C OLLIDING A B OX AND A P LANE
The last of the very simple contact generation algorithms is between a box and a
plane (strictly a half-space). This is the first algorithm that can return more than one
contact.
Remember that we are trying to use contacts that are as simple to process as pos-
sible. We prefer to use point-face contacts if we can. In this case we can. Rather than
return the contact of the face of one box with the half-space, we return four contacts
for each corner point with the half-space. Similarly, if an edge is colliding with the
plane, we treat it as two point-face contacts for each end of that edge. Thus there can
be up to four contacts, and each is a point-face contact. Figure 13.10 illustrates this.
We can find the set of contacts by simply checking each vertex of the box one by
one and generating a contact if it lies below the plane. 1
The check for each vertex looks just like the check we made with the sphere-plane
detector:
d
=
p
·
l
l
Because the vertices are only points, and have no radius, we simply need to check to
see whether the sign of d is positive or negative. A collision therefore occurs if
p
·
l < l
1. Generating contacts for a true plane, rather than a half-space, is somewhat more difficult because we
need to find the set of contacts on each side of the plane, determine which side the box is on, and generate
contacts for the opposite set. For a half-space we simply test whether vertices are through the plane.