Animation
Read blender-scene for the local session contract.
Tool names below use its capability mapping when the named interface is absent;
read only the relevant rows in blender-volatile.
Motion is part of the default deliverable: unless the user explicitly asked
for a static scene, the Scene Passport defines at least one purposeful beat.
"Dynamic" means the viewer can watch something change and read it — not that
everything moves at once.
Motion plan
Pin down before keying anything:
- fps, frame range, playback duration;
- rest pose and beat structure: anticipation → action → settle;
- the carrier of each beat — object, camera, light, material, or environment;
- the loop boundary, if the motion loops;
- constraints, parenting, and control objects involved.
One clear primary action, restrained secondaries, and at least one stable
frame suitable for inspection and thumbnails.
Build animation
- Bulk transform/lens keys →
bl_keyframe_properties; turntable, camera
orbit/dolly, idle → bl_create_motion_preset; frame inspection →
bl_set_frame.
- Drop to
bl_execute only for what typed tools cannot express: F-curve
edits, constraints, drivers, armatures, shape keys, simulations, NLA.
- Key rigs and semantic controls, not a pile of unrelated child transforms.
Key only properties that need to change.
- Choose interpolation on purpose: Bezier for organic motion, linear for
constant rates, constant for stepped switches.
- Pick quaternion or Euler deliberately so rotations do not flip mid-move;
connector boundaries speak radians.
- Object animation and data animation are separate sets. Lens,
clip_start,
and dof.focus_distance keys belong to camera.data. Follow Path
offset_factor belongs to the constraint and is animated on its owning
object, through constraints[...].offset_factor. Retime both object and
data actions, filtering their correct action slots (blender-volatile),
then check each shot's transform, path, lens, and focus key ranges.
- Simulations must be deterministic enough that the audited frames reproduce.
Constraints and drivers
Copy Location on a spinning child is forbidden. Any residual offset
between target and owner orbits with the spin, and the part reads as about
to detach. Only rotation can be compensated.
- Copy the steering component alone, in the control object's space
(CUSTOM to CUSTOM, single axis, mix AFTER). Copying full world rotation
drags support noise into the tilt.
- The local space of a bone-parented child is useless: its own rotation is
static and the motion lives in the bone. Name the control object explicitly.
- Rolling contact is verified arithmetically. Rotation per frame equals
distance per frame divided by radius, and the residual stays sub-millimetre.
The driver's sign follows the direction of the part's local axis; the
contact point holding still is the proof.
- Ray-based ground tracking over a faceted support mesh returns noise, not
travel. Disable it and solve the surface response deliberately.
Surface contact solve
For anything that must stay planted on uneven ground while it moves:
- One ray per support point gives the gaps.
- The mean gap is the height correction.
- Compute the slope angle with
atan2(height_difference, support_distance).
Use the full horizontal distance between the two compared support points,
not the half-span. For points at -a and +a, the denominator is 2*a.
Resolve the sign and roll/pitch axis in the rig's local frame and check
the resulting contact gaps; banked or uneven supports may need a fitted
support plane rather than two independent slopes.
- Two passes per frame for convergence.
- Ease in and out over roughly 20 frames with a quintic so no correction
pops on entry.
A baked contact holds height but does not pick up lateral slope: it passes on
straights and drifts on arcs. Level ground under a tilted body means the body
is wrong, not the ground.
Rotational aliasing
An N-fold symmetric spinner strobes when its step per frame lands near a
multiple of its symmetry sector — the blades nearly fill the previous
positions and the eye reads a jerk or a reversal. Hold a constant step half a
sector away from any multiple of the sector, then re-phase after the shot so
the rotation stays continuous.
Blur decides that read more than the keys do. A shutter near 0.2 at one step
is no smear at all; 0.75 over 12 steps is the working baseline, raised toward
0.95 by key for the fastest passage. The viewport never renders blur — spin
and smear are judged from a render only.
Visibility keying
- Visibility switches are keyed with constant interpolation.
- Constraint targets hide in render only.
hide_viewport drops an object
from the depsgraph, and every constraint reading it gets a stale matrix.
- Everything else hides in render and viewport together. A render-only hide
leaves the viewport lying about framing: geometry sitting millimetres in
front of a lens still blocks the preview.
- Props belong to the shots that need them, not to every range sharing a
state.
animation_data_clear() removes visibility keys along with everything else.
Dynamic defaults
When the brief names no motion:
- product/prop — slow turntable or camera orbit, settling on the hero angle;
- environment — subtle camera drift plus a restrained practical-light change;
- character/creature — idle breathing or weight shift, only if the rig
supports it;
- abstract — one focal transformation with a small secondary response.
Never invent character acting, destructive simulation, or a camera that never
stops when subtle motion already satisfies the dynamic requirement.
Motion audit
Sample at minimum: first/rest frame, departure, peak of the fastest change,
settle, final frame plus the loop seam where one exists. Run bl_audit_motion
and view a bl_render_contact_sheet. At each sample check framing, collisions
and intersections, visibility, constraint behavior, shading continuity, and
motion direction. Open F-curves only when the typed audit cannot explain a
failure — a still render proves nothing about animation.
The pass fails if expected properties carry no keys, motion is imperceptible,
objects teleport, rotations flip, the camera loses the subject, or the loop
jumps. Fix and sample again.
1---2name: blender-animation3description: Dynamic-by-default motion — the motion plan, semantic rigs, deliberate interpolation, constraints and drivers, surface contact, rotational aliasing, visibility keying, dynamic defaults per subject type, and the motion audit.4---56# Animation78Read [blender-scene](../blender-scene/SKILL.md) for the local session contract.9Tool names below use its capability mapping when the named interface is absent;10read only the relevant rows in [blender-volatile](../blender-volatile/SKILL.md).1112Motion is part of the default deliverable: unless the user explicitly asked13for a static scene, the Scene Passport defines at least one purposeful beat.14"Dynamic" means the viewer can watch something change and read it — not that15everything moves at once.1617## Motion plan1819Pin down before keying anything:2021- fps, frame range, playback duration;22- rest pose and beat structure: anticipation → action → settle;23- the carrier of each beat — object, camera, light, material, or environment;24- the loop boundary, if the motion loops;25- constraints, parenting, and control objects involved.2627One clear primary action, restrained secondaries, and at least one stable28frame suitable for inspection and thumbnails.2930## Build animation3132- Bulk transform/lens keys → `bl_keyframe_properties`; turntable, camera33 orbit/dolly, idle → `bl_create_motion_preset`; frame inspection →34 `bl_set_frame`.35- Drop to `bl_execute` only for what typed tools cannot express: F-curve36 edits, constraints, drivers, armatures, shape keys, simulations, NLA.37- Key rigs and semantic controls, not a pile of unrelated child transforms.38 Key only properties that need to change.39- Choose interpolation on purpose: Bezier for organic motion, linear for40 constant rates, constant for stepped switches.41- Pick quaternion or Euler deliberately so rotations do not flip mid-move;42 connector boundaries speak radians.43- Object animation and data animation are separate sets. Lens, `clip_start`,44 and `dof.focus_distance` keys belong to `camera.data`. Follow Path45 `offset_factor` belongs to the constraint and is animated on its owning46 object, through `constraints[...].offset_factor`. Retime both object and47 data actions, filtering their correct action slots (`blender-volatile`),48 then check each shot's transform, path, lens, and focus key ranges.49- Simulations must be deterministic enough that the audited frames reproduce.5051## Constraints and drivers5253- **`Copy Location` on a spinning child is forbidden.** Any residual offset54 between target and owner orbits with the spin, and the part reads as about55 to detach. Only rotation can be compensated.56- Copy the steering component alone, in the control object's space57 (CUSTOM to CUSTOM, single axis, mix AFTER). Copying full world rotation58 drags support noise into the tilt.59- The local space of a bone-parented child is useless: its own rotation is60 static and the motion lives in the bone. Name the control object explicitly.61- **Rolling contact is verified arithmetically.** Rotation per frame equals62 distance per frame divided by radius, and the residual stays sub-millimetre.63 The driver's sign follows the direction of the part's local axis; the64 contact point holding still is the proof.65- Ray-based ground tracking over a faceted support mesh returns noise, not66 travel. Disable it and solve the surface response deliberately.6768## Surface contact solve6970For anything that must stay planted on uneven ground while it moves:71721. One ray per support point gives the gaps.732. The mean gap is the height correction.743. Compute the slope angle with `atan2(height_difference, support_distance)`.75 Use the full horizontal distance between the two compared support points,76 not the half-span. For points at `-a` and `+a`, the denominator is `2*a`.77 Resolve the sign and roll/pitch axis in the rig's local frame and check78 the resulting contact gaps; banked or uneven supports may need a fitted79 support plane rather than two independent slopes.804. Two passes per frame for convergence.815. Ease in and out over roughly 20 frames with a quintic so no correction82 pops on entry.8384A baked contact holds height but does not pick up lateral slope: it passes on85straights and drifts on arcs. Level ground under a tilted body means the body86is wrong, not the ground.8788## Rotational aliasing8990An N-fold symmetric spinner strobes when its step per frame lands near a91multiple of its symmetry sector — the blades nearly fill the previous92positions and the eye reads a jerk or a reversal. Hold a constant step half a93sector away from any multiple of the sector, then re-phase after the shot so94the rotation stays continuous.9596Blur decides that read more than the keys do. A shutter near 0.2 at one step97is no smear at all; 0.75 over 12 steps is the working baseline, raised toward980.95 by key for the fastest passage. The viewport never renders blur — spin99and smear are judged from a render only.100101## Visibility keying102103- Visibility switches are keyed with constant interpolation.104- **Constraint targets hide in render only.** `hide_viewport` drops an object105 from the depsgraph, and every constraint reading it gets a stale matrix.106- Everything else hides in render and viewport together. A render-only hide107 leaves the viewport lying about framing: geometry sitting millimetres in108 front of a lens still blocks the preview.109- Props belong to the shots that need them, not to every range sharing a110 state.111- `animation_data_clear()` removes visibility keys along with everything else.112113## Dynamic defaults114115When the brief names no motion:116117- product/prop — slow turntable or camera orbit, settling on the hero angle;118- environment — subtle camera drift plus a restrained practical-light change;119- character/creature — idle breathing or weight shift, only if the rig120 supports it;121- abstract — one focal transformation with a small secondary response.122123Never invent character acting, destructive simulation, or a camera that never124stops when subtle motion already satisfies the dynamic requirement.125126## Motion audit127128Sample at minimum: first/rest frame, departure, peak of the fastest change,129settle, final frame plus the loop seam where one exists. Run `bl_audit_motion`130and view a `bl_render_contact_sheet`. At each sample check framing, collisions131and intersections, visibility, constraint behavior, shading continuity, and132motion direction. Open F-curves only when the typed audit cannot explain a133failure — a still render proves nothing about animation.134135The pass fails if expected properties carry no keys, motion is imperceptible,136objects teleport, rotations flip, the camera loses the subject, or the loop137jumps. Fix and sample again.