Game Development Reference
In-Depth Information
Calculating the Desired Velocity Change
As I mentioned at the start of the chapter, the velocity change we are looking for is
given by the same equation we used for particles:
v s =−
cv s
v s
=−
v s
cv s
=−
( 1
+
c)v s
In other words, we need to remove all the existing closing velocity at the contact, and
keep going so that the final velocity is c times its original value but in the opposite
direction. In code this is simply
real deltaVelocity = -contactVelocity.x * (1 + restitution);
If the coefficient of restitution, c , is zero, then the change in velocity will be suf-
ficient to remove all the existing closing velocity but no more. In other words, the
objects will end up not separating. If the coefficient is near 1, the objects will separate
at almost the same speed at which they were closing.
The value of the coefficient depends on the materials involved in the collision.
Values around 0.4 look visibly very bouncy, like a rubber ball on a hard floor. Values
above this can start to look unrealistic.
14.2.5
C ALCULATING THE I MPULSE
With the desired velocity change in hand, the impulse is given by equation 14.3.
Because we are not concerned with friction, we are only concerned with the im-
pulse in the direction of the contact normal. In contact coordinates the contact nor-
mal is the X axis, so the final impulse vector is
g
0
0
g contact =
where g is the impulse, as earlier. This is implemented as
Excerpt from src/contacts.cpp
// Calculate the required size of the impulse.
impulseContact.x = desiredDeltaVelocity / deltaVelocity;
impulseContact.y = 0;
impulseContact.z = 0;
At this stage it is convenient to convert out of contact coordinates into world
coordinates. This makes applying the impulse in the final stage simpler. We can do
this using our basis matrix to change coordinates:
g world =
M g contact