Game Development Reference

In-Depth Information

•

The sum of all impulses applied to a contacting rope vertex must be zero

(otherwise it'll gain infinite velocity, since the impulses have dimensions

relative to the main set of bodies, which is infinitely heavier than the rope).

Thus,
P
i
must be equal in length to
P
i
, and their vector sum must be

equal to
P
i
(applied from the contacting body along the normal).

Impulses don't change along straight fragments, so
P
i
=

•

−

P
i
+1
.

•

There should be no relative movement between the rope vertices along the

rope direction, also, no relative movement between the contacting vertices

and the corresponding point on the body. These last two conditions are

only active while the rope remains strained (note that this state can alternate

during the solving process). This gives us

·

d
i
=
v
i
+1
·

v
i

d
i

(8.1)

d
i
)=
v
i

v
i

·

(
d
i−
1
−

·

(
d
i−
1
−

d
i
)

v
i

v
i

·

d
i
=
v
i
·

d
i−
1
−

·

(
d
i−
1
−

d
i
)

(8.2)

Since we know
v
0
·

d
0
, we can use Equation (8.1) to compute
v
1
·

d
0
,then

use
v
1
and Equation (8.2) to compute
v
1
·

d
1
, and so on, until we reach the

last segment, for which we can now write the dynamic contact inequality:

N−
1

v
i

v
N

·

d
N
−

v
0
·

d
0
+

·

(
d
i−
1
−

d
i
)
<
0
.

(8.3)

i
=1

The zero on the right-hand side can of course be replaced by a desired

“penalty” velocity that will pull the rope ends together if the total length

after simulation exceeds the target one.

Now we need to compute how applying an impulse will affect this inequality.

To do that, we apply a test impulse with magnitude one to the two end bodies and

along all contact normals (in the latter case multiplied by (
d
i
−
d
i−
1
) since it's

being applied from both sides) and measure the changes in velocities, summing

them in accordance with Equation (8.3). Let's denote this change
d
v
. Resolving

this contact is now simple: whenever the inequality in Equation (8.3) becomes

violated by
v
, we apply an impulse
v/
d
v
to the rope (which means applying it to

all affected bodies). It's also quite straightforward to use it in a direct-ish solver,

since those usually just need to know the dot product between the contact impulse

and the resulting velocity changes.

The following pseudocode shows the two core steps of the procedure—

applying an impulse at all contact points and measuring velocity response.