Bézier and Catmull–Rom Curves
A camera has to sweep from the doorway, past the chandelier, and settle on the villain's face. A
firefly has to trace a lazy loop across the garden. In both cases an animator is really asking one
question: given a handful of points in space, what smooth path threads through them?
The answer, almost everywhere in animation and games, is a cubic curve — a path
described by a degree-three polynomial in a parameter t \in [0,1].
Two cubics do nearly all the work. The Bézier curve lets the artist shape a
path with handles, like bending a wire; the Catmull–Rom spline lets the artist
pin a path so it passes exactly through chosen points, like threading beads on a string.
This page pins down both, connects them through the shared
Hermite form,
and shows when to reach for which.
The cubic Bézier: four points, one curve
A cubic Bézier is built from four control points
P_0, P_1, P_2, P_3. The curve starts exactly at
P_0 and ends exactly at P_3, but it
only approaches the two middle points — P_1 and
P_2 act as handles that pull the tangents at the ends.
The precise recipe is a blend of the four points weighted by the Bernstein basis:
B(t) = (1-t)^3\,P_0 + 3(1-t)^2 t\,P_1 + 3(1-t)\,t^2\,P_2 + t^3\,P_3, \qquad t \in [0,1].
The four weights (1-t)^3, 3(1-t)^2t,
3(1-t)t^2, t^3 are always non-negative and
always sum to 1 — they are a weighted average, so the curve can
never escape the convex hull of its four control points. At
t=0 only the first weight survives (B(0)=P_0);
at t=1 only the last (B(1)=P_3). That is why the
endpoints are hit exactly and the middle ones are not.
- B(0) = P_0 and B(1) = P_3 — the curve
passes through its first and last control points.
- B'(0) = 3(P_1 - P_0) and
B'(1) = 3(P_3 - P_2) — the handles set the start/end
tangent directions (and their length sets the "pull").
- The whole curve lies inside the convex hull of
\{P_0,P_1,P_2,P_3\}.
De Casteljau: a curve made of nested lerps
You rarely need to expand that polynomial. The
de Casteljau algorithm evaluates B(t) using nothing but
repeated linear interpolation
(lerp), \text{lerp}(A,B,t) = (1-t)A + tB. It is numerically stable, geometric,
and it hands you the construction point on the curve for free. Starting from the four control points:
\begin{aligned}
&\text{level 1: } &Q_0 &= \text{lerp}(P_0,P_1,t), &Q_1 &= \text{lerp}(P_1,P_2,t), &Q_2 &= \text{lerp}(P_2,P_3,t)\\
&\text{level 2: } &R_0 &= \text{lerp}(Q_0,Q_1,t), &R_1 &= \text{lerp}(Q_1,Q_2,t)\\
&\text{level 3: } &B(t) &= \text{lerp}(R_0,R_1,t).
\end{aligned}
Three lerps, then two, then one — a little pyramid that collapses four points down to the single
point on the curve. The picture below animates exactly this: as t slides,
the point B(t) traces the curve while sitting at the tip of the collapsing
pyramid.
Watch the construction point move
The bold curve is a cubic Bézier through four fixed control points. Drag t
and the marker rides along it — this is the tip of the de Casteljau pyramid,
B(t). Notice the curve touches the first and last control points
but sails past the inner two: they only bend it.
The faint dashed polygon joining the four control points in order is the control
polygon. The curve mimics its overall shape — a taut, smoothed shadow of it — always staying
inside its convex hull.
Worked example: evaluate at t = 0.5
Take the control points
P_0=(0,0), P_1=(1,3),
P_2=(3,3), P_3=(4,0) and evaluate the curve at
the midpoint t=\tfrac12 by de Casteljau. Every lerp at
t=\tfrac12 is just the average of two points.
Level 1 (midpoints of the control polygon edges):
Q_0 = \tfrac{P_0+P_1}{2} = (0.5,\,1.5),\quad
Q_1 = \tfrac{P_1+P_2}{2} = (2,\,3),\quad
Q_2 = \tfrac{P_2+P_3}{2} = (3.5,\,1.5).
Level 2:
R_0 = \tfrac{Q_0+Q_1}{2} = (1.25,\,2.25),\qquad
R_1 = \tfrac{Q_1+Q_2}{2} = (2.75,\,2.25).
Level 3 — the point on the curve:
B(0.5) = \tfrac{R_0+R_1}{2} = (2,\,2.25).
Sanity check against the Bernstein form: at t=\tfrac12 the weights are
\tfrac18, \tfrac38, \tfrac38, \tfrac18, and
\tfrac18(0)+\tfrac38(3)+\tfrac38(3)+\tfrac18(0) = \tfrac{9}{8}+\tfrac{9}{8} = 2.25
for the y-coordinate — a match. By symmetry the curve peaks at
x=2, exactly halfway.
Catmull–Rom: a spline that hits every point
A Bézier is wonderful when the artist wants to sculpt a shape, but it is the wrong tool when
the brief is "the camera must pass through these five marks." Placing handles so a
Bézier threads a list of points is fiddly. The Catmull–Rom spline solves exactly
this: give it a sequence of points \dots,P_{i-1},P_i,P_{i+1},\dots and it
produces a smooth curve that interpolates — passes through — every one of them.
The trick is that it invents a sensible tangent at each point automatically. At
P_i it uses the direction from the previous point to the
next one:
m_i = \frac{P_{i+1} - P_{i-1}}{2}.
That is: "head roughly the way the path is going, judged by your neighbours." A point with a tangent
is a Hermite
segment, so each span P_i \to P_{i+1} is a cubic pinned at both ends with
those neighbour-derived tangents. Catmull–Rom is the special cardinal spline with
tension parameter \tfrac12; crank the tension up and the curve tightens
toward straight segments, down and it bulges.
- It interpolates every control point: the curve passes through each
P_i exactly.
- The tangent at an interior point is
m_i = \tfrac12(P_{i+1} - P_{i-1}).
- It is C^1 continuous — position and first derivative match across
segment joins, so no visible kinks in the motion.
They are all the same cubic in disguise
Bézier, Hermite and Catmull–Rom are three bases for the very same family of cubic curves —
pick whichever inputs are convenient and convert. A Hermite segment is given by endpoints
P_0,P_1 and tangents m_0,m_1; its equivalent
Bézier control points are
C_0 = P_0,\quad C_1 = P_0 + \tfrac{m_0}{3},\quad C_2 = P_1 - \tfrac{m_1}{3},\quad C_3 = P_1.
Because a Catmull–Rom span is just a Hermite with
m_0 = \tfrac12(P_2 - P_0) and
m_1 = \tfrac12(P_3 - P_1) (using the four surrounding points), you can
drop those tangents straight into the formula above to get its Bézier handles:
C_1 = P_1 + \frac{P_2 - P_0}{6},\qquad C_2 = P_2 - \frac{P_3 - P_1}{6}.
So a game engine can store an artist's Catmull–Rom path but hand a GPU tessellator plain Bézier
segments — same curve, different clothes. This is why the three names travel together.
Which one, when?
| Cubic Bézier | Catmull–Rom |
| Passes through interior points? | No — approximates | Yes — interpolates |
| Artist control | Handles shape the tangents | Automatic (neighbour-based) |
| Best for | Vector art, font outlines, hand-shaped paths | Camera / motion paths through fixed marks |
| Local editing | Move a handle → local change | Move a point → nearby spans shift |
Rule of thumb: if the artist wants to sculpt the shape and doesn't care that the curve
misses the handles, use Bézier. If the path must hit specified positions —
waypoints, a dolly track, keyframed markers — use Catmull–Rom.
This trips up nearly everyone the first time. It is tempting to read
P_0,P_1,P_2,P_3 as "four points the curve visits." It doesn't. The curve
only touches P_0 and P_3; the inner two are
handles that pull the tangents — the curve typically sails well short of them. If you place a
camera keyframe on P_1 expecting the lens to travel through it, the shot
will miss the mark and you'll wonder why. When you genuinely need the path to hit
every listed point, that is precisely the job of Catmull–Rom (which
does interpolate all its points) — or you must solve for the Bézier handles that force the
pass-through. Pick the tool that matches the promise you're making to the artist.
Pierre Bézier was an engineer at Renault in the 1960s, designing the sweeping metal
curves of car bodies. He needed a way to describe those surfaces to a machine that both a mathematician
and a designer could trust — hence the control-point handles that let a stylist "feel" the shape.
Paul de Casteljau devised the evaluation algorithm slightly earlier at rival Citroën,
but it stayed a trade secret, so the curves took Bézier's name. Edwin Catmull (later a co-founder of
Pixar) and Raphael Rom published their interpolating spline in 1974 — the same Catmull
whose name is now on a Turing Award for computer graphics. Two industries, cars and cartoons, quietly
agreeing on the same cubic.