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.

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.

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ézierCatmull–Rom
Passes through interior points?No — approximatesYes — interpolates
Artist controlHandles shape the tangentsAutomatic (neighbour-based)
Best forVector art, font outlines, hand-shaped pathsCamera / motion paths through fixed marks
Local editingMove a handle → local changeMove 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.