You have a dolphin. It is a beautiful mesh — forty thousand vertices, every scale and fin modelled
by hand. Now the director wants it to squash as it launches out of the water and
stretch as it arcs through the air. You are absolutely not going to drag forty thousand
vertices around by hand. So instead you drop the whole dolphin inside an invisible rubbery
box — a coarse lattice of, say,
This is Free-Form Deformation (FFD), introduced by Thomas Sederberg and Scott Parry
in 1986. Its one big idea is startling the first time you meet it: you do not deform the
object at all — you deform the space the object sits in, and the object simply
reads its new position out of that warped space. This page builds that idea from a
A Bézier curve takes one parameter
Read that formula slowly, because it hides the whole magic. The local coordinates
Here is the property that makes FFD indispensable. The deformation is a smooth function of space — Bernstein polynomials are infinitely differentiable — so whatever mesh you drop inside is warped by the very same smooth map. The lattice knows nothing about how many vertices the object has; it only warps points. Feed it a ten-vertex proxy or a ten-million-vertex film asset and both bend identically and smoothly.
That decoupling is the point. A modeller sculpts detail once at full resolution; an animator shapes motion with a handful of lattice handles. The two never fight over vertex counts.
A full trivariate volume is hard to draw on a page, so collapse it to a single edge — a row of four
control points, a cubic Bézier "lattice" with just the
Notice two things. The bold curve is smoother than the cage — the sharp corners of
the control polygon are rounded off by the Bernstein blend, which is exactly the smoothness that lets
a jagged, coarse lattice produce a graceful bend. And the ends stay pinned: the
outermost control points did not move, so the vertices near
Take four control points along one lattice edge at
which gives
The midpoint rose by
FFD is a deformer — one stage in a stack that carries a rest mesh to its final deformed shape. It plays two roles. Applied after skinning, it is a corrective / art-direction layer: squash-and-stretch on a jumping character, a broad "make the belly rounder" note, a stylised smear on a fast action — shape changes the joint hierarchy could never express. Applied before skinning, it can reshape the rest pose itself, letting one skeleton drive many silhouettes. Either way the lattice is small, animatable, and keyframeable just like any other channel.
Absolutely — the "trivariate Bézier volume" is just one choice of blending function, and the idea generalises the moment you swap it out. Replace the Bézier basis with a B-spline volume and you get local control: moving one handle only affects nearby cells, so a big lattice stays cheap to edit. Coons and Griessmair extended FFD to non-parallelepiped lattices; Coquillart's Extended FFD (EFFD) lets the lattice itself be an arbitrary shape (a cylinder around an arm, say) for more natural bends. Later work drops the grid entirely and drives the warp from scattered handles or a cage of arbitrary topology (cage-based / harmonic coordinates). All of them share FFD's founding move: don't push the vertices, warp the space and let the vertices ride.
The single most common misconception is to think of FFD as "grabbing the nearby vertices". It does not know your vertices exist. It warps a continuous region of space, and vertices merely report where that space carried them. Two consequences bite beginners:
Vertices in the same lattice cell move together. Two points that are far apart on the surface but fall inside the same coarse cell get almost the same displacement — so a lattice too coarse for the motion will drag a leg and a tail as one lump. The fix is not to "select fewer vertices" (there is no selection) but to add lattice resolution: more control points means smaller cells and finer, more local control. Conversely, a lattice that is too coarse simply cannot represent a sharp local wrinkle — the deformation it produces is only ever as detailed as its control grid, no matter how dense the mesh inside. Match the lattice resolution to the motion you need, not to the polygon count of the model.