Expression Limits
Some performers push a control further than the character should ever go. Expression Limits caps that per character instead of per take: a profile asset holds a floor, a knee and a ceiling for each expression, you dial it against a solved take and watch the face follow, and every export of every job that names the profile comes out limited. The solved Performance on disk is never touched.
Open the panel
Open a solved Performance asset and click Expression Limits in its toolbar.
With no profile set, New from Take creates one next to the Performance, named
CLP_<Performance>, with one unlimited row per expression the take carries.
The profile is an ordinary asset: keep it per character and point every job for that character
at it.


What a limit does
Three handles per row. Mid is the knee and the one input that passes through untouched. Above it the response is scaled so full input lands exactly on Max; below it the same scaling runs the other way and zero input lands on Min. The output never leaves Min..Max, and the curve keeps its shape at both ends rather than flattening into a plateau. Defaults of 0 / 0.5 / 1 are a no-op.
Rows are ordered 0 <= Min < Mid < Max <= 1. Dragging one handle past
another pushes it rather than swapping the two, so a row can never be inverted.
Live in the Performance editor
Moving a handle rebakes the take's face animation in place: Sequencer keys, the Control Rig tab and the viewport all follow. Long takes rebake on a short delay after you let go rather than on every pixel of a drag.
The asset on disk stays raw. Limits live in memory only: they are pulled out before the package saves and put back afterwards, and a re-solve re-applies them. Epic's own Export Animation from inside the editor exports the limited curves and stamps the result so it is never limited a second time on playback.
In a batch
Set Curve Limit Profile in a job's Export options, on a Solve Defaults template, or per take. Every export that job writes - AnimSequence, Level Sequence Control Rig bake, and FBX - comes out limited; leaving it empty means no limits. The frames are limited for the length of the export and restored afterwards, so Re-Export with an edited profile regenerates every output without re-solving.
Each job logs what its limits actually did: per curve, the take's own peak, what that peak became, and the share of frames that changed. The same report rides in the saved manifest. A limit that reports no affected frames is a limit that was never reached.
Limits on a character, outside a take
Right-click the profile asset in the Content Browser: