DirectXGraphics:
Smooth Keyframe Animations
Author:
Jack Hoxley
Written: 4th September 2001
Contact: [EMail]
Download: GR_SmoothAnim.Zip
(1061kb)
Contents
of this lesson
1. Introduction
2. About the function(s)
3. Application of the function
1.
Introduction
Welcome
to another extended tutorial for Direct3D8 programming
in visual basic. For todays article we'll be covering
smooth keyframe animation. This builds directly
upon the code, and the technique learnt in the
previous lesson in this series - number 10 (read
it here). If you
haven't read it, read it first - otherwise you'll
be lost here!
2.
About the function(s)
The
functions that we're going to use are fairly standard
maths algorithms, and they do look pretty ugly!
but exactly how they work is really not at all
important here (I have no idea how to derive such
parametric equations), all you need to know is
what they do, and how to use them.
I'm
going to examine 3 types of function - there is
a fourth, the Bezier curve, but whilst it's better
known and looks slightly nicer it's absolutely
useless for animation as the curve has a nice
tendency to do absolutely different things to
the animation!
Type
1: Standard Linear Equation
this is the standard equation that we've
used before (in lesson 10). The maths equation
looks like this:
where:
a = Source point
(x,y)
b = Destination
point (x,y)
t = Interpolant
between 0.0 and 1.0, at t=0.0 we get point
a, and at t=1.0 we get point b, at t=0.5
we get a value 1/2 way between the two.
this
produces a keyframe animation between 5 points
that looks like this:
looks
good enough, if the black dots are our keyframes
then any frame between those will be somewhere
on the red line. The big draw back here is the
asphetic appearance of the whole thing - take
the 2nd and 5th keyframes, they result in rather
significant changes of direction, on screen this
can look a little odd - your character may appear
to jerk their legs/arms in a completely different
direction...
Type
2: Hermite Spline Equation
So we solve the previous problem with a new
function. This is where it gets more interesting,
instead of suddenly changing direction at the
keyframes it slowly (or quickly) blends between
the new and old direction - producing a nice,
rounded, smooth line going through all the keyframes...
The
maths equation for this is complicated - and it
looks ugly! Just check this one out:
Looks
pretty dont it! And all those parameters mean:
t = interpolation
amount, 0.0 to 1.0 - same as for linear function,
0.0=start and 1.0=end
P0 = Start point
P1 = End point
M0 = Tangent at start
M1 = Tangent at end
The
second equation is used to calculate the tangents
M0 and M1, and is fairly simple really.
a = tensile factor, 0.0 = Smooth curve, 1.0 =
straight line, -1.0 = very bendy line!
Stick
this all together and we get a curve looking like
the one in the following diagram - using the same
keypoints as the linear example, you can see how
much smoother the result is.
Type
3: Catmull-Rom Splines
This is the last type we're going to look
at, and to all intents and purposes it's a simpler
version of the hermite spline formula - and for
a=0.0 you tend to get
an exactly identical result. It is also slightly
faster to compute:
Still
quite complicated, but really not that bad when
it comes to using it.
t = Interpolant
amount, again, on a 0.0 to 1.0 scale
P0 = First point
P1 = Second point
P2 = Third point
P3 = Fourth point
the
equation actually only draws a curve between points
P1 and P2, it uses P0 and P3 to guide the curve
(so it know where the curve should go basically).
The end result looks like this:
3.
Application of the function(s)
All
of the source code for this is included in the
download, so you'll need to get that in order
to see how it all fits together. It's essentially
been built around the download for lesson #10
- the original keyframe tutorial. The only major
difference being that there are some additional
functions for interpolating using the different
methods.
You
should of already worked out that the two new
functions are going to be slower than the basic
linear equation, but thats the trade off between
performance and presentation... to help combat
this I've included my own custom C++ DLL to do
some of the grunt work, and it does do it considerably
quicker (200fps instead of 80fps), you can use
this library if you really want to - or you can
use straight VB code, your choice entirely.
Another
possibility is the application to skeletal animation
with this sample, you can use these functions
to interpolate the bones more smoothly - if they
are currently setup on a keyframe system.
I
strongly suggest that you download the sample
code and watch the animation run through a few
times in each mode (tap SPACE to change), I found
it very easy to tell between the spline and the
linear functions - you can even notice the triangles
changing shape with the linear function (not good).
Also, many thanks to Dmitriy Safro (www.safrosoft.com)
for providing the 3D model.
You
can download the source code from the top of the
page, or from the downloads
page. enjoy...
any
feedback or improvements can be emailed to me
- I'm always interested...
|