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.
- C^0 — position continuous: the two pieces meet,
L(t_0) = R(t_0). There is no gap and no teleport; the value never jumps.
- C^1 — velocity continuous: additionally the first
derivatives agree, L'(t_0) = R'(t_0). The tangent matches, so speed does
not jump — no visible snap.
- C^2 — acceleration continuous: additionally the
second derivatives agree, L''(t_0) = R''(t_0). Curvature flows through
the seam; there is no sudden jerk in acceleration.
- In general C^n means the curve and its first
n derivatives all match at the seam. Each rung contains the one
below it: C^2 \Rightarrow C^1 \Rightarrow C^0.
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.
- G^0 is identical to C^0 — the pieces meet.
- G^1: the tangent directions match, i.e.
R'(t_0) = k\,L'(t_0) for some scale k > 0.
The curve has no corner, but the speed may still jump.
- Every C^1 join is G^1 (take
k = 1), but not conversely.
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:
| Rung | Condition | Requires |
| C^0 | R(1) = L(1) | a = 1 |
| C^1 | R'(1) = L'(1) | b = 2 |
| C^2 | R''(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:
| Scheme | Continuity | What that feels like |
| Linear (straight in-betweens) | C^0 only | Corners at every key — velocity snaps at each one; the mechanical, "robot" look. |
| Catmull–Rom spline | C^1 | Passes through every key with matching tangents — no speed snaps, but curvature can jump. |
| Natural cubic / uniform cubic B-spline | C^2 | Acceleration 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:
- Any animation channel (a moving object, a rotating limb) wants at least
C^1. A C^1 break is a sudden change of
velocity — a snap — and the eye is very good at spotting speed discontinuities.
- A camera path wants C^2. A path that is
C^1 but not C^2 has continuous velocity but a
step in acceleration — and because the viewer rides the camera, a jump in acceleration is
felt as a jolt, a lurch, even though nothing in the frame ever teleported or snapped.
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.