Continuity: C⁰, C¹, C²

A character's hand sweeps across the frame, a camera cranes over a city, a bouncing logo settles onto a shelf. Behind every one of these is an animation curve — a channel's value plotted against time — and the single word that decides whether the motion looks alive or looks broken is smooth. But "smooth" is a slippery word. A path can join up perfectly and still snap; it can flow without a kink and still jolt. To an animator these are vague complaints; to the mathematics underneath they are precise, nameable defects.

This page pins the word down. "Smoothness" comes in a graded ladder — C^0, C^1, C^2 — each rung asking one more derivative to agree across the join between two pieces of curve. Knowing which rung you are on tells you exactly what the viewer will feel: a teleport, a snap of speed, or a jolt of acceleration. And it tells you which spline to reach for.

The continuity ladder

Suppose an animation curve f(t) is built from two pieces joined at a seam (a knot) at time t = t_0 — call the left piece L(t) and the right piece R(t). We ask how well they match up at the seam, derivative by derivative.

Read the ladder as a chain of physical quantities. Position is what you see; its slope is velocity; the slope of that is acceleration. So C^0 guarantees position doesn't break, C^1 guarantees velocity doesn't break, and C^2 guarantees acceleration doesn't break. Every rung up the ladder makes the motion one degree calmer.

Parametric vs geometric continuity

There is a subtler, weaker cousin of the ladder. Parametric continuity C^1 demands the derivative vectors be equal — same direction and same magnitude. Geometric continuity G^1 asks only that the tangents point the same direction; their lengths may differ by any positive scale factor.

Here is the crux for animation. Geometric continuity is a statement about the shape traced in space — the racing line, the arc a hand carves. Parametric continuity is a statement about the schedule — when the object is where. A path can be geometrically flawless (a beautiful smooth curve on paper) yet parametrically ugly, because it is traversed at a jumping speed. A curve is G^1 but not C^1 exactly when you have a smooth-looking road but a foot that stamps the accelerator at the seam. The eye watching motion judges the schedule, not just the shape — so for animation you almost always want the parametric ladder.

A tidy way to picture it: take a C^1 join and reparametrise the right half — replay the exact same spatial curve, but faster. The picture is unchanged (still G^1, no corner), yet the velocity at the seam has been multiplied, so it is no longer C^1. The corner you feel is a corner in time, invisible on the drawing.

Feel the C¹ break for yourself

Below, two segments are joined at t = 0.5. The left piece climbs with slope 1; the slider sets the incoming slope of the right piece — the velocity it leaves the seam with. The bold curve is position x(t); the second curve is its slope x'(t), the velocity.

Slide to 1 and the two pieces share a tangent: position is a single straight climb, velocity is a flat line — a clean C^1 join, no snap. Slide away from 1 and a corner appears in position: it is still unbroken (C^0 — the pieces meet), but the velocity curve now steps vertically at the seam. That instantaneous jump in velocity is the snap the viewer sees. The position graph barely looks wrong; the velocity graph shows the whole crime.

Worked example: check a seam by hand

Let the left piece be L(t) = t^2 on [0, 1], and the right piece a general quadratic written about the seam t_0 = 1:

R(t) = a + b\,(t-1) + c\,(t-1)^2.

We compute L and its derivatives at the seam: L(1) = 1, L'(t) = 2t so L'(1) = 2, and L''(t) = 2. And for the right piece at the seam, R(1) = a, R'(1) = b, R''(1) = 2c. Now match rung by rung:

RungConditionRequires
C^0R(1) = L(1)a = 1
C^1R'(1) = L'(1)b = 2
C^2R''(1) = L''(1)c = 1

With a = 1, b = 2, c = 1 the right piece is R(t) = 1 + 2(t-1) + (t-1)^2 = t^2 — the curve simply continues, fully C^2. Now break it deliberately: take a = 1 but b = \tfrac12 (say R(t) = 1 + \tfrac12(t-1)). The seam is still joined — R(1) = 1 = L(1), so C^0 holds — but the velocity leaps from L'(1) = 2 down to R'(1) = \tfrac12, a jump of 1.5 units per second in a single instant. That is the visible snap, and no amount of staring at the position graph makes it obvious — you have to look at the derivative.

Which curve is on which rung?

You rarely set continuity by hand — you pick an interpolation scheme and inherit its guarantee. The common animation curves land on different rungs:

SchemeContinuityWhat that feels like
Linear (straight in-betweens)C^0 onlyCorners at every key — velocity snaps at each one; the mechanical, "robot" look.
Catmull–Rom splineC^1Passes through every key with matching tangents — no speed snaps, but curvature can jump.
Natural cubic / uniform cubic B-splineC^2Acceleration flows through the seams — the smoothest, but a B-spline misses the keys.

This is a genuine trade-off, not a ranking. Catmull–Rom is the animator's favourite because it is C^1 and interpolates (goes through) every keyframe — you place a key and the curve honours it. A B-spline buys you an extra rung of smoothness (C^2) but only approximates the control points, which is why it is loved for camera rigs and hated for "hit this exact pose on frame 30". You choose the rung the shot needs.

How high do you need to climb?

The rule of thumb follows straight from the ladder:

The reason a camera is fussier than an object is embodiment. When you watch a ball, a small acceleration jump reads as liveliness. When the camera is your point of view, that same jump is a shove to your inner ear — the difference between a smooth crane move and a cheap dolly that clunks. This is why virtual-camera tools default to C^2 curves and why flight-sim and VR paths obsess over the second derivative.

Because Catmull–Rom is only C^1. It guarantees your velocity never snaps, which is enough for a hand or a bouncing prop, but its curvature (second derivative) can jump at every control point. On a fast camera move through several waypoints, those curvature jumps show up as tiny lurches — the picture flows, yet something feels faintly seasick. Swap to a C^2 scheme (a cubic B-spline, or a specially fitted "camera spline") and the lurches vanish, at the cost that the camera no longer passes exactly through your waypoints. Many camera tools split the difference: interpolating C^2 splines that hit the keys and keep acceleration continuous, paid for with more computation per knot.

The classic trap: you join two clips or two path segments, the position graph is unbroken, everything connects, and you call it smooth. It is not. C^0 only promises the path has no gaps — the speed can still jump at the seam, and that speed jump is a visible snap the audience reads as a mistake. "It connects" is a claim about C^0; "it moves smoothly" is a claim about C^1. Always check the derivative, not just the value.

The flip side: sometimes you break C^1 on purpose. A stepped or linear tangent mode in your curve editor deliberately introduces corners so the motion hits a pose and stops dead, or changes direction with a hard snap — exactly the punchy, staccato feel a stylised action, a UI transition, or a robotic character wants. Breaking the ladder is a fault only when it is accidental. A snap you chose is style; a snap you didn't notice is a bug.