Game Development Reference
In-Depth Information
where q rel is the position of the point we are interested in, relative to the object's center
of mass; p is the position of the object's center of mass (i.e.,
˙
p is the linear velocity of
the whole object); and θ is the object's angular velocity.
To calculate the velocity in contact coordinates we use this equation and then
transform the result by the transpose of the contact basis matrix:
Excerpt from src/contacts.cpp
Vector3 Contact::calculateLocalVelocity(unsigned bodyIndex, real duration)
{
RigidBody *thisBody = body[bodyIndex];
// Work out the velocity of the contact point.
Vector3 velocity =
thisBody->getRotation() % relativeContactPosition[bodyIndex];
velocity += thisBody->getVelocity();
// Turn the velocity into contact coordinates
Vector3 contactVelocity = contactToWorld.transformTranspose(velocity);
// And return it.
return contactVelocity;
}
The calculateInternals method finds the overall closing velocity at the contact
point, by subtracting the second body's closing velocity from the first:
// Find the relative velocity of the bodies at the contact point.
contactVelocity = calculateLocalVelocity(0, duration);
if (body[1]) {
contactVelocity -= calculateLocalVelocity(1, duration);
}
Because this algorithm uses both the contact basis matrix and the relative contact
positions, it must be done last.
14.4.3
R ESOLVING P ENETRATION
We have visited each contact and calculated the data we'll need for both resolution
steps. We now turn our attention to resolving the interpenetration for all contacts.
We will do this by taking each contact in turn and calling a method ( applyPosition-
Change ) that contains the algorithm in section 14.3 for resolving a single contact.
We could simply do this in the same way as for prepareContacts :