About Shake Splines |
Have your pillows ready, this has a high geek-factor:
Natural splines
NSpline(cycle, value@key1,value@key2,...value@keyN)
NSplineV(time_value,
cycle, value@key1,value@key2,...value@keyN)
These are great mostly because of their C2 nature. Second order continuity means the acceleration is smoothly varying over time, which means the motion is visually pleasing because the visual system is very sensitive to 1st and 2nd order discontinuities but not to higher order ones, etc, etc. But, in order to achieve this C2 thing, the whole curve has to be adjusted whenever a CV is moved. For example, moving Key 3 in the illustration changes the segments even out to Key 6. Bummer, even if the influence decreases very quickly as the number of intermediate CVs increases. On top of that, the CVs completely define the curve, that means no tangent control whatsoever. Beauty has its price. | ![]() |
CSpline(cycle, value@key1,value@key2,...value@keyN)
CSplineV(time_value, cycle, value@key1,value@key2,...value@keyN)
These trade off C2 for local control. When a CV moves, only 4 segments are affected (2 before, 2 after the CV). In addition, for any CV, tangents are automatically computed to be parallel to the segment joining the previous CV and the next CV. They are the programmer's best friend because they are so simple to evaluate: only 4 points are needed, which simplifies data management (no tangent and other way-too complicated stuff). Simplicity sometimes has the appearance of beauty. | ![]() |
Jeffress splines
JSpline(cycle, value@key1,value@key2,...value@keyN)
JSplineV(time_value, cycle, value@key1,value@key2,...value@keyN)
These are similar to CSplines, except they are guaranteed to never overshoot. If two CVs have the same Y value, a flat segment connects them. Very nice for animation since you know pretty much exactly what your limits are going to be. | ![]() |
Hermite splines
Hermite(cycle,(value,tangent1,tangent2)@key1,...(value,tangent1,tangent2)@keyN)
HermiteV(time_value, cycle,(value,tangent1,tangent2)@key1,...(value,tangent1,tangent2)@keyN)
These also give up on trying to produce a C2 curve, but they add tangent controls so we like them even if we know the animation is likely to look crappy unless we eyeball it to be close to C2 each time we move stuff around. Being able to break the tangents is cool (Ctrl-click in the curve editor btw). It takes some effort to get it right but you can shape it the way you want. Some think that's the true beauty. | ![]() |
Linear splines
Linear(cycle,value@key1,value@key2,...value@keyN)
Not much mystery here. No smoothness, but you know exactly what you are getting. A kind of Primitive Beauty. | ![]() |
You can change how the curve cycles its animation before and after the curve ends. This is visualized with a dotted line in the Curve Editor. The value is declared with the first parameter of a curve, i.e. Linear(CycleType,value@frame1,....). Each cycle type has a numeric code:
KeepValueThis takes the first and last point and keeps it at that value when a frame is evaluated outside of the curve's time range.
|
![]() |
KeepSlopeThis takes the slope of the curve at the last point and shoots a line off into infinite. |
![]() |
RepeatValueThis loops the animation curve. It works best when you set the first and last points to have the same Y value, and a similar slope to ensure a nice animation cycle. |
![]() |
MirrorValueThis also loops the animation, but inverts it every time it repeats the cycle. |
![]() |
OffsetValueThis also loops the animation, but offsets the repeated curve so that the end keys match up. |
![]() |