Game Development Reference
In-Depth Information
We have inserted a new step between 5 and 6, checking whether the impulse respects
the static friction equation and using dynamic friction if it doesn't.
Step 2 requires modification. Currently it works out the change in velocity given a
unit impulse in the direction of the contact normal. We are now dealing with all three
contact directions. We need to calculate the change in velocity given any combination
of impulses in the three contact directions. The impulse can be expressed as a vector
in contact coordinates:
Vector3 contactImpulse;
The x component represents the impulse in the direction of the contact normal, and
the y and z components represent the impulse in the plane of the contact.
The result of step 2 will be a matrix: it will transform a vector (the impulse) into
another vector (the resulting velocity). With this matrix the rest of the algorithm is
simple. In step 3 we will find the inverse of the matrix (i.e., the matrix that transforms
the desired change in velocity into a required impulse), and in step 5 we will transform
the desired velocity vector to get the contactImpulse vector.
So how do we calculate the matrix? We follow through the same steps we saw in
section 14.2.2. We calculate the velocity change as a result of angular motion, and the
velocity change as a result of linear motion.
Velocity from Angular Motion
In section 14.2.2 we saw the algorithm for calculating rotation-derived velocity from
impulse:
Vector3 torquePerUnitImpulse =
relativeContactPosition % contactNormal;
Vector3 rotationPerUnitImpulse =
inverseInertiaTensor.transform(torquePerUnitImpulse);
Vector3 velocityPerUnitImpulse =
rotationPerUnitImpulse % relativeContactPosition;
Vector3 velocityPerUnitImpulseContact =
contactToWorld.transformTranspose(velocityPerUnitImpulse);
The first stage calculates the amount of torque for a unit impulse in the direction
of the contact normal. The second stage converts this torque into a velocity using
the inertia tensor. The third stage calculates the linear velocity of the contact point
from the resulting rotation. And the final stage converts the velocity back into contact
coordinates.