Game Development Reference
In-Depth Information
In the same way, impulse is a force exerted over a short period of time:
g
=
f t
where f is force and t is time. Given the impulse required to remove the velocity and
the duration of the update, we can calculate the force required to remove the velocity.
The equation still requires a normal reaction force. This can be calculated in the
same way, but looking at the contact normal. The normal reaction force can be ap-
proximately calculated from the amount of velocity removed in the direction of the
contact normal.
If the desired change in velocity at the contact normal is v , then the reaction force
can be approximated as
f
=
vmt
The velocity resolution algorithm we already have involves calculating the im-
pulse needed to achieve the desired change in velocity. This impulse is initially found
in contact coordinates. Since we will be working in impulses, we can combine the
preceding equations with the friction equations, to end up with
g max =
g normal μ
where g normal is the impulse in the direction of the contact normal (i.e., the im-
pulse we are currently calculating in our velocity resolution algorithm). Notice that
these impulse values are scalar. This tells us the total impulse we can apply with static
friction. In code this looks like
Vector3 impulseContact;
// ... Find the impulse required to remove all three components of
real planarImpulse = real_sqrt(impulseContact.y*impulseContact.y +
impulseContact.z*impulseContact.z);
// Check whether we're within the limit of static friction.
if (planarImpulse > impulseContact.x * friction)
{
// Handle as dynamic friction.
}
Dynamic friction can be handled by scaling the y and z components of the im-
pulse so that their combined size is exactly μ times the size of the x impulse: