Constructing smooth movement paths from spline curves.
This program demonstrates the use of spline curves to create smooth
paths connecting a number of node points. This can be useful for
constructing realistic motion and animations.
The technique is to connect the series of guide points p1..p(n) with
spline curves from p1-p2, p2-p3, etc. Each spline must pass though
both of its guide points, so they must be used as the first and fourth
of the spline control points. The fun bit is coming up with sensible
values for the second and third spline control points, such that the
spline segments will have equal gradients where they meet. I came
up with the following solution:
For each guide point p(n), calculate the desired tangent to the curve
at that point. I took this to be the vector p(n-1) -> p(n+1), which
can easily be calculated with the inverse tangent function, and gives
decent looking results. One implication of this is that two dummy
guide points are needed at each end of the curve, which are used in
the tangent calculations but not connected to the set of splines.
Having got these tangents, it becomes fairly easy to calculate the
spline control points. For a spline between guide points p(a) and
p(b), the second control point should lie along the positive tangent
from p(a), and the third control point should lie along the negative
tangent from p(b). How far they are placed along these tangents
controls the shape of the curve: I found that applying a 'curviness'
scaling factor to the distance between p(a) and p(b) works well.
One thing to note about splines is that the generated points are
not all equidistant. Instead they tend to bunch up nearer to the
ends of the spline, which means you will need to apply some fudges
to get an object to move at a constant speed. On the other hand,
in situations where the curve has a noticable change of direction
at each guide point, the effect can be quite nice because it makes
the object slow down for the curve.