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 clip
s 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.