Three independent "servo channels" — neck pan (top-down dial), jaw hinge, and eyebrow tilt — each step through a loop of keyframe angles. Instead of jumping straight from one angle to the next, each channel is driven through a time-scaling function s(u) that maps segment progress u ∈ [0,1] to a smooth interpolation fraction:
θ(t) = θ_i + (θ_i+1 − θ_i) · s(u)
Linear: s(u) = u
Trapezoid: ramp / cruise / ramp, fraction "a" each end
peak rate v_p = 1 / (1 − a) (so s(1) = 1 exactly)
Quintic: s(u) = 10u³ − 15u⁴ + 6u⁵ (minimum-jerk)
Fixed vs. the 3D source: the original trapezoid used ramp/cruise areas normalized to a peak rate of 1 regardless of the ramp fraction a, so its s(1) only reached 1−a (e.g. 0.75 for a=0.25) instead of 1 — every segment fell short of its target keyframe and snapped forward at the next segment. This 2D engine normalizes by the correct peak rate v_p = 1/(1−a), verified numerically (s(1) = 1.000 for every a), so the trapezoid profile lands exactly on each keyframe like the other two.
The quintic form is the standard "S-curve" used in real animatronic and industrial-servo motion controllers: its velocity ds/du = 30u²−60u³+30u⁴ starts and ends at exactly zero, so peak jerk stays low — that is what reads as lifelike rather than mechanical. The trapezoid is the classic industrial compromise: bounded acceleration, cheap to compute, but a velocity discontinuity at each ramp boundary (tune "ramp fraction" to see the kink move). Linear has neither: velocity jumps instantly at every keyframe.
- Motion profile / ramp fraction — swap the time-scaling function and, for the trapezoid, its ramp width; the angle/velocity/acceleration graphs redraw live.
- Show duration — stretches or compresses the whole keyframe loop; velocity scales ∝ 1/duration, acceleration ∝ 1/duration².
- Expressiveness — scales each channel's keyframe swing around its own mean, independent of timing.
- Drag the stage — rotates the camera azimuth (a cosmetic parallax on the face), separate from the neck-pan dial which shows the actual servo yaw.