TCB and Kochanek–Bartels Splines
You set three keys: a lamp is off (value 0) at frame 0, blazes to
full (value 1) at frame 12, and dims back to half
(value 0.5) at frame 24. The computer must invent every frame in between —
and, crucially, it must pass exactly through your three values, because those are the
poses you committed to. The machinery that threads a smooth curve through fixed keys, while still
leaving you knobs to shape the feel of the pass, is the interpolating spline — and the one
that animation tools reach for is the Kochanek–Bartels (TCB) spline built on
cubic Hermite segments.
This page builds it from the ground up: one Hermite segment from two points and two tangents, the
Catmull–Rom rule for choosing those tangents automatically, and the three animator knobs —
Tension, Continuity and Bias — that Kochanek and
Bartels bolted on top. It connects to the
splines
you already know, and to the
timing and spacing
those curves encode.
One segment: cubic Hermite
Between two neighbouring keys, a keyframe channel is a single cubic Hermite piece.
It is pinned by four things: the value at the left key p_0, the value at
the right key p_1, and a tangent (an incoming velocity) at
each — m_0 and m_1. With a local parameter
u running 0 \to 1 across the segment, the curve is
a blend of four fixed basis functions:
p(u) = h_{00}(u)\,p_0 + h_{10}(u)\,m_0 + h_{01}(u)\,p_1 + h_{11}(u)\,m_1
- h_{00}(u) = 2u^3 - 3u^2 + 1 — weights the left value
p_0 (it is 1 at
u=0, 0 at u=1).
- h_{10}(u) = u^3 - 2u^2 + u — weights the left tangent
m_0.
- h_{01}(u) = -2u^3 + 3u^2 — weights the right value
p_1.
- h_{11}(u) = u^3 - u^2 — weights the right tangent
m_1.
You can check the endpoints by hand: at u=0 only
h_{00}=1 survives, so p(0)=p_0; at
u=1 only h_{01}=1 survives, so
p(1)=p_1. The curve hits both keys exactly — that is what
interpolating means — and the tangent terms bend the path in between without moving
the endpoints.
Seeing the four blends
Here are the four basis functions on [0,1]. Notice the two value blends
(h_{00} and h_{01}) hand off from one to the
other — one falls from 1 to 0 while the other
rises — and the two tangent blends (h_{10},
h_{11}) are little bumps that vanish at both ends, so a tangent tugs the
middle of the segment but never disturbs the keys.
Every interpolating keyframe curve you will ever edit is just these four shapes, scaled by your two
values and two tangents and added up.
Choosing the tangents: Catmull–Rom
A single segment needs tangents, but where do they come from when you have a whole chain of
keys \dots, p_{i-1}, p_i, p_{i+1}, \dots? The cheapest sensible answer is
Catmull–Rom: point each key's tangent along the line joining its two neighbours.
- The tangent at key i is the centred difference of its neighbours:
m_i = \frac{p_{i+1} - p_{i-1}}{2}.
- This makes the curve C^1 (smooth, no corners) and needs
no manual handles — the tangents are computed for you.
This is the default "auto" or "spline" tangent mode in most tools: drop keys, get a smooth curve that
passes through all of them. It is fast and usually pleasant — but as we will see, its automatic
tangents can overshoot, which is exactly why the animator wants a few knobs to
override them.
The three knobs: Tension, Continuity, Bias
Kochanek and Bartels (SIGGRAPH 1984) generalised Catmull–Rom by splitting each key's tangent into an
incoming and an outgoing tangent and scaling the two neighbour
differences by three parameters, each running roughly -1 \to 1. Write
\Delta^- = p_i - p_{i-1} and
\Delta^+ = p_{i+1} - p_i:
d_i^{\text{out}} = \tfrac{(1-t)(1+b)(1+c)}{2}\,\Delta^- + \tfrac{(1-t)(1-b)(1-c)}{2}\,\Delta^+
d_i^{\text{in}} = \tfrac{(1-t)(1+b)(1-c)}{2}\,\Delta^- + \tfrac{(1-t)(1-b)(1+c)}{2}\,\Delta^+
- Tension t — scales both tangents by
(1-t). High tension shrinks the tangents toward zero, so the curve
bends sharply and pulls straight toward the keys (a taut, snappy pass); low/negative tension makes
long, loose, swooping tangents.
- Continuity c — at c=0 the
incoming and outgoing tangents are equal, so the curve is C^1
smooth. Push c away from 0 and they diverge,
opening a corner at the key — exactly what you want for a sharp change of
direction (a bounce, a hit, a whip).
- Bias b — weights the tangent toward the
incoming side (b>0, an overshoot that leans past the
key before easing back) or the outgoing side (b<0, an
undershoot that anticipates the next key). It controls which side of the key the curve leans.
Set all three to zero and both formulas collapse to
\tfrac12(\Delta^- + \Delta^+) = \tfrac12(p_{i+1} - p_{i-1}) — plain
Catmull–Rom. So TCB is Catmull–Rom with three dials, and Catmull–Rom is the origin of
that dial-space.
Worked example: evaluate a segment, then tighten it
Take a chain of keys with values (-3, 0, 1, 0) at frames
(-1, 0, 1, 2), and work on the segment from the key at frame
0 (value p_0 = 0) to the key at frame
1 (value p_1 = 1). The Catmull–Rom tangents are
m_0 = \frac{1-(-3)}{2} = 2, \qquad m_1 = \frac{0-0}{2} = 0.
Evaluate the midpoint u = \tfrac12. The basis values there
are h_{00}=\tfrac12, h_{10}=\tfrac18,
h_{01}=\tfrac12, h_{11}=-\tfrac18, so
p(\tfrac12) = \tfrac12(0) + \tfrac18(2) + \tfrac12(1) - \tfrac18(0) = 0.25 + 0.5 = 0.75.
The straight-line midpoint would be (0+1)/2 = 0.5; the spline bulges up to
0.75 because of that steep incoming tangent
m_0 = 2. Now turn tension up. Tension scales both tangents
by (1-t), so m_0 = 2(1-t),
m_1 = 0, and the midpoint becomes
p(\tfrac12) = 0.5 + \tfrac18 \cdot 2(1-t) = 0.5 + 0.25(1-t).
At t=0 that is 0.75 (the loose Catmull–Rom
bulge); at t=\tfrac12 it flattens to 0.625; and
at t=1 the tangents vanish and the segment collapses onto the straight chord
at 0.5. Raising tension flattens the curve toward the
line between the keys — quantitatively, right there in the arithmetic.
Play with the tension
Below is a TCB curve threaded through six fixed keys (the faint straight segments connect the key
values so you can see where they are). The dashed line marks the ceiling
y = 1. At tension 0 this is
pure Catmull–Rom — and watch the curve overshoot above the dashed line just after the peak
key, even though no key value exceeds 1. Drag the tension up and the tangents
shrink: the overshoot shrinks with them, and the whole curve pulls taut toward the keys. Negative
tension does the opposite — looser, wilder swoops.
This is the knob an animator actually turns when an auto-tangented pass looks too soft or bulges where
it shouldn't. It is the same idea as pulling in a Bézier handle — TCB is just a friendlier,
three-number way to say the same thing.
Interpolating vs approximating
- Interpolating splines — Hermite, Catmull–Rom, Kochanek–Bartels — pass
through their control points. The points are the keyframes, hit exactly.
- Approximating splines — uniform B-splines, and Bézier curves at their interior
control points — are only pulled toward their control points and generally do
not touch them.
For keyframe animation this distinction is decisive. When you pose a character at frame 12, you mean
that pose, at that frame — not "somewhere near it". So keyframe channels use
interpolating splines. B-splines, prized in modelling for their smoothness and local
control, are the wrong tool for a keyframe: they would sand the pose away. (This is why editing a
Bézier F-curve in a tool moves the key and its two handles together — the key stays an
interpolated anchor.)
How your tool exposes all this
You rarely type t, c and
b. Instead the graph editor gives each key a tangent handle
(or a tangent mode) that is the same information wearing a costume:
| What you do in the tool | What it changes underneath |
| "Auto" / "Spline" tangent mode | Catmull–Rom tangents (t=c=b=0) |
| Shorten a handle | Raise tension (smaller tangent) |
| "Broken" handles (two independent sides) | Non-zero continuity — a corner |
| Tilt the handle to one side | Bias — lean the overshoot before/after the key |
| "Flat" / "Stepped" tangents | Zero tangents (max tension) / no interpolation at all |
3DS Max exposes literal TCB controllers with Tension/Continuity/Bias spinners; Maya, Blender and After
Effects wrap the very same maths in draggable Bézier-style handles. Under every one of them sits the
cubic Hermite segment from the top of this page.
Doris Kochanek and Richard Bartels were at Canada's National Research Council, and the problem they
named in their paper was precisely the animator's problem: an interpolating spline that is
mathematically lovely can still feel wrong — too floaty here, too stiff there, needing a hard
accent on one key. Rather than force artists to hand-place tangent vectors (tedious and unintuitive),
they invented three perceptual dials — tightness, whether-to-corner, and lean — that map onto
how animators actually talk about a move. It is a small classic of putting a human-friendly interface
on a piece of geometry, and it is why "TCB" is still a tangent mode in software four decades later.
Auto (Catmull–Rom) tangents overshoot. Because a key's tangent is set by its
neighbours, a curve can sail past a key's value on the way in or out — the classic
symptom is a channel that should be bounded (an opacity, a blend weight, a "look-at" fraction that must
stay in [0,1]) briefly poking above 1 or
below 0 even though every key is legal. In the interactive above you can watch the
pure-Catmull–Rom curve cross the dashed ceiling with all keys at or under
1. Fixes: raise the tension near that key (shrinks the
tangent that causes the bulge), flatten the tangent at the extreme key (set it to
zero), or clamp the output value. Never assume "all keys are in range" implies "all
in-betweens are in range" — for interpolating splines, it does not.