Blending

Animation blending is any technique that allows more than one animation clip to contribute to the final pose.

Two or more input poses produce a single output pose for the skeleton.

Blending has two uses:

  • Combining two smaller animations into one animation, such as injured animation + walking animation = walking while injured animation.
  • Interpolating between two poses between different points in time.

Linear interpolation

Temporal interpolation

Temporal interpolation identifies two times for two poses, then interpolates the joint positions based on a blend factor.

Given:

  • \(N\) number of joints
  • A beginning pose: \(P_A^{\text{skel}} = \left\{ \left( P_A \right)_j \right\} | _{i=0}^{N-1} \)
  • A target pose: \(P_B^{\text{skel}} = \left\{ \left( P_B \right)_j \right\} | _{i=0}^{N-1} \)

The linear interpolation (LERP) between these poses is given by: \[ \begin{align} \left(P_{\text{LERP}}\right)_j &= \text{LERP} \left( \left(P_A\right)_j , \left(P_B\right)_j , \beta \right) \\ &= \left(1 - \beta(t)\right) P_j \left( t_1 \right) + \beta(t) P_j \left(t_2\right) \end{align} \]

Where:

  • Blend factor \(\beta(t)\) is determined by \[ \beta(t) = \frac{t-t_1}{t_2 - t_1} \]
  • \(t_1\) is the time that the first pose is shown by itself.
  • \(t_2\) is the time that the second pose is shown by itself.
  • \(t\) is the time \(t_1 \le t \le t_2\) to interpolate along.

We could also use a one-dimensional Bézier curve for an even smoother transition.

  • When applied to a clip that is being blended out, this is an ease-out curve.
  • When applied to a clip that is being blended in, this is an ease-in curve.

Cross-Fading

One great usage of temporal interpolation is to cross-fade a transition from one pose to the other.

  • Smooth transition
    • Overlay two animations over the top of each other and then cross fade from one animation to the next. The time overlap that we are cross-fading over defines the \(t_1\) and \(t_2\).
    • Clips should be looping and their timelines synchronized so that the character's limbs are roughly in the same positions.
  • Frozen transition
    • Freeze the first clip in place, then allow the second clip to take over the pose gradually.
    • Works well when the two clips are unrelated and cannot be time-synchronized.

LERP Blends

Imagining a LERP blend occurring along a timeline can help with visualizing other blending methods.

1D LERP Blending

  • Define a range, .e.g, [0, 1], [-1, -1], [-128, 127], or any other.
  • Place one or more poses along this range.
  • Selecting any blending factor along this range, you can imagine the LERP between the two closest pose points.

2D LERP Blending

  • Imagine two 1D LERP blends, perhaps one is a range of the character turning horizontally in a 180 degree arc, and the other blend is the character turning vertically in a 180 degree arc.
  • You can then LERP and blend together the combined effect of using the blending factors of both items.
  • Graphically, you can imagine this as a 2D grid with two continous but bounded axes. Moving along one axis animates in one direction and moving along another axis animates in the other direction.
  • A big use case for this is to allow you character to look in arbitrary up/down/left/right (and all shades between) directions.

Generalized N-clip LERP blending

  • Any number of clips can be blended together. If each clip represents a point on a 2D grid, the space they create (with three clips, they make a triangle, 5 clips makes a pentagon, etc.) can be used to find the blending point between all the involved clips.
  • This is done by finding the barycentric coordinates of a given point within the shape created by the clips.
  • This works because the LERP blend is effectively a weighted average of the given points.

\[ \vec{b} = \alpha \vec{b_0} + \beta \vec{b_1} + \gamma \vec{b_2} \]

Where

  • \( \alpha + \beta + \gamma = 1 \)

Additive Blending

This almost should be called something other than "blending" because it approaches the task of combining multiple animation clips in way completely different from the LERP discussions above.

A difference clip is the difference between two animation clips. Such difference clips can be added onto other animation clips in order to produce interesting variations.

  • A difference clip encodes the changes that need to be made to transform one pose into another pose.

Conceptually, a difference clip looks like this

Conceptual, not actual: \[ D = S - R \]

Where

  • \(D\) is the difference clip
  • \(S\) is a source animation clip
  • \(R\) is a reference animation clip

Animation clips \(S\) and \(R\) are actually transform matrices, which you can't really just subtract them. In actuality, you need to multiply by the inverse.

\[ D_j = S_j R_j^{-1} \]

To add a difference pose onto a target pose, you can concatenate the difference and the target transform.

\[ A_j = D_j T_j = \left( S_j R_j^{-1} \right) T_j \]

To check that this is correct:

\[ \begin{align} A_j &= D_j R_j \\ &= S_j R_j^{-1} R_j \\ &= S_j \end{align} \]

You can use LERP in addition to these difference clips to change how extreme the animation is.

You can still go wrong with additive blending. Rules of thumb:

  • Keep hip rotation sot a minimum in the reference clip
  • Should and elbow joints should be in neutral poses in the reference clip to minimize over-rotation.
  • Animators should create new difference animations for each core pose.