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

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.

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^+

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

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 toolWhat it changes underneath
"Auto" / "Spline" tangent modeCatmull–Rom tangents (t=c=b=0)
Shorten a handleRaise tension (smaller tangent)
"Broken" handles (two independent sides)Non-zero continuity — a corner
Tilt the handle to one sideBias — lean the overshoot before/after the key
"Flat" / "Stepped" tangentsZero 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.