Game Development Reference
previously there would have been one or two contacts with obvious interpenetration,
this method shares the interpenetration among all the conflicting contacts, which
may be less noticeable.
Unfortunately relaxation also makes it more likely that interpenetration is notice-
able at the end of an update when there are few collisions. It is beneficial to have all
contacts share a small degree of interpenetration when the alternative is having one
very bad contact, but in most cases it is undesirable and a full-strength resolution step
is more visually pleasing.
It is relatively simple to add relaxation to your engine (you just multiply the pen-
etration to resolve by a fixed proportion before performing the normal resolution
algorithm). I'd advise you to build the basic system without relaxation, and then add
it only if you find that you need to.
I MPLEMENTING N ONLINEAR P ROJECTION
Let's look in more detail at the nonlinear projection method and get it working in our
code. We start knowing the penetration depth of the contact: this is the total amount
of movement we'll need to resolve the interpenetration. Our goal is to find the pro-
portion of this movement that will be contributed by linear and angular motion for
We first make an assumption: we imagine the objects we are simulating were
pushed together so that they deformed. Rather than the amount of interpenetration,
we treat the penetration depth of the contact as if it were the amount of deforma-
tion in both bodies. As we saw in the section on resolving velocities, this deformation
causes a force that pushes the objects apart. This force, according to D'Alembert's
principle, has both linear and angular effects. The amount of each depends on the
inverse mass and the inverse inertia tensor of each object.
Treating interpenetration in this way allows us to use the same mathematics we
saw in section 14.2. We are effectively modeling how the two objects would be pushed
apart by the deformation forces: we are using a physically realistic method to find the
linear and angular components we need.
Calculating the Components
For velocity we were interested in the amount of velocity change caused by the rota-
tion change from a single unit of impulse. This quantity is a measure of how resistant
the object is to being rotated when an impulse or force is applied at the contact point.
To resolve penetration we use exactly the same sequence of equations. We find the
resistance of the object to being moved in both a linear and angular way.
Recall that the resistance of an object to being moved is called its “inertia.” So
we are interested in finding the inertia of each object in the direction of the contact
normal. This inertia will have a linear component and a rotational component.
The linear component of inertia is, as before, simply the inverse mass. The an-
gular component is calculated using the same sequence of operations that we used
previously. Together the code looks like this: