Game Development Reference
In-Depth Information
2.7
Joints
Joints are at the most fundamental level simpler than contacts. It is an equality
constraint, keeping the relative velocity between two bodies to zero. No inequal-
ities, no interdependent friction, etc. However, the way we combine constraints,
and add limits, breakable constraints, joint friction, and damping typically make
them fairly complex.
2.7.1 Drift
The most common artifact with joints is drifting, i.e., an unintended separation
between the two jointed objects. It is the joint counterpart to stacked objects
sinking into each other. The solver simply fails to find a valid solution within the
limited number of iterations. However, as described in the introduction to this
chapter, even with an unlimited number of iterations, joints can still drift due to
the linearization of velocities. Most engines cope with drifting in the same way
they cope with penetration or friction drift: simply add a geometric term, acting
as a spring to compensate for the drift.
2.7.2 Solving Direct
A good way to reduce joint drift is to solve as many constraints as possible at
the same time. Since joints are made up of equality constraints, they can be
solved as a system of linear equations, sometimes referred to as a direct solver.
Solving a system of linear equations is more complicated than applying sequential
impulses, but it does pay off in stability. On the upside, these two methods can
be easily combined. Some engines solve systems of three orthogonal constraints
(this particular assembly is found in many joint types) as a special case with a
three-by-three matrix inversion and then interweave the rest of the constraints
using sequential impulses.
The way the constraints are placed also matters when it comes to stability.
Consider a ball joint. It might be tempting to use a single constraint in the direc-
tion of maximum separation or in the direction of relative velocity. But remember
that whatever constraints go into the solver are the only constraints avoiding mo-
tion, so a single constraint will naturally transfer motion from the constraint axis
to the other two. A proper ball joint needs three constraints to be stable, and even
the way the three constraints are aligned matters. Keeping the constraints aligned
roughly the same way every frame helps stability. World axes are a good start-
ing point, but using the axes of one of the objects can be even better, since they
will then be stationary to at least one of the objects, keeping the configuration as
similar as possible.