Game Development Reference
In-Depth Information
Figure 13.3. Pre-deformation (left). Mesh after a sharp deformation resulting in unnatural
stretching (center). The deformed mesh after several iterations of solving the position
constraints (right).
inertia . The jiggle deformer is the temporal memory that records the previous
positions/velocities of the vertices and ensures that subsequent positions follow a
trajectory that mitigates any visible popping artifacts (which are common amongst
the outputs from relaxation and collision deformers).
Just like all the other deformers described in this chapter, the input to this
function is a mesh from a previous deformer. The input mesh acts as an attractor
that the jiggle deformer tries to mimic. The strength of the attraction is defined in
the springk parameter. Lower values create more floppy skin.
Each time the jiggle deformer is evaluated, it records the last position and
velocity of each vertex. To create the smooth attraction behavior, we assume
that each vertex is connected to its corresponding input vertex by a spring. The
rest length of this spring is always zero so that it acts by pulling the vertex to be
coincident with the input position. The force of the attraction is proportional to
the length of the spring according to Hooke's Law.
To integrate the position ahead in time, we use the force from the spring as
an acceleration that is applied directly to the velocity from the previous time step.
Then we do a Euler-integration step to find the final output position. This is shown
in the pseudocode in Listing 13.6.
//Typical values
float damping = 0.6;
float springk = 25.0;
float timeStep = 1.0 / 24.0;
for (eachVertex)
{ //Calculate the acceleration
Vector3d a = (vertex.inputPos vertex.lastPos) springk;
//Calculate new velocity