Blending Skeletal Animations
You would normally use a series of pre−calculated key−framed animations in
your game projects. You create these animations using 3D modeling programs such
as discreet's 3DStudio Max or Caligari's trueSpace. Although they served their
purpose quite nicely, those pre−created animation sequences did lack one major
aspect uniqueness. Once an animation, always an animation meaning that the
animations are the same, regardless of how many times you play them.
Moving into a more dynamic world of animation, the technique of animation
blending has become more than a buzz word. What's that you don't know what
animation blending is? Animation blending is the ability to take separate
animations and blend, or rather combine, them to create a new animation.
For instance, as Figure 6.1 shows, you can blend an animation of your
character walking and another animation of him waving his arm to create an
animation of him walking and waving his arm at the same time!

You don't have to stop with only blending two animations, you could go on to
combine three, four, or even ten different animations into one unique animation!
With each new animation you add, the possibilities of blending increase
exponentially. With only a small set of animations at your disposal, you could
literally create hundreds of new animations using animation blending.
Now, I won't lie to youthe theory and implementation of animation blending is
extremely, excruciatingly simple. That's right; animation blending is one of
those things that makes you wonder why the heck you weren't doing it earlier.
It's that easy! It all has to do with the way you combine the various
transformations of the skeletal structure's bones.
Combining Transformations
Your skeletal animations are merely series of transformation matrices applied
to the bones of your mesh's skeletal structure. These transformations include
translations, scaling, and rotations. For the most part, the transformations are
rotations. The bones rotate at the joint; only the root bone is typically
allowed to translate around the world, and even then that's best left up to the
world transformation (rather than directly translating the bones themselves).
Those points aside, the transformations create the animation.
As you can see in Figure 6.2, you can create new poses by adding various
transformations to the existing transformations of the skeletal structure. For
example, to make the skeleton's arm move, add a rotational transformation matrix
to the arm bone transformation. Slowly increasing the rotational value added to
the bone transformation creates smooth animation.

Figure 6.2: The skeleton's default pose (on the left) has an associated set
of transformation matrices; when combined with animation set transformation
matrices, these will create new poses.
You can see that you achieve animation by combining (through matrix
concoction) or directly storing a set of animation transformations with your
skeleton's transformation matrices. To smoothly animate a mesh, you can use
linear interpolation to scale the animation set's transformation matrices over
time.
So at the most basic level, you are dealing with transformation matrices to
create animation; there's one transformation matrix to apply for each bone in
the mesh. The pre−calculated key−frame animation set is the source of the
transformation matrices that are applied to the bone's transformation.
Think about thisinstead of taking that single transformation matrix from your
animation set (from a matrix key frame or combined from a series of position,
translation, and rotation key frames), why couldn't you just take a series of
transformations that affect the same bone from multiple animation sets and
combine them? After all, you're using matrix concoction to combine multiple
transformations, so why not just throw in a few more transformations from
multiple animations while you're at it?
Whoa! You caught me thereyou can't just concoct the matrices and expect the
transformations to come out correctly. Think of it: Matrix concoction is
non−commutative, meaning that the order in which you multiply the various
transformations is crucial. If you were to multiply two transformations that
both were rotated and then translated, you would end up with a final
transformation that rotates, translates, rotates, and finally translates. That's
obviously too much transformation data for a single bone that typically rotates
and then
translates.
To correct this problem, you need to add the transformations instead of
multiplying them. So, for instance, the previous two transformations that rotate
and then translate would combine into a transformation that only rotates and
then translates (as opposed to rotating, translating, rotating, and finally
translating). Adding transformations is perfectly acceptable!
Adding two matrices (represented by D3DXMATRIX objects) is as simple as the
following line of code:
D3DXMATRIX matResult = Matrix1 + Matrix2;
From there on, you can use the matResult matrix for your transformations;
rest assured, it represents the combined transformations of Matrix1 and Matrix2.
To combine more animation transformations, just add another matrix to matResult
and continue until you have combined all the transformations you want to use.
Now that you know this information, you can begin combining the various
transformations of separate animation sets.