You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bone-level constraints — the rigger's bread and butter outside of IK. Look-at (head tracking a target), copy-rotation (mirror another bone), parent-of (independent transform parenting), limit-rotation (clamp Euler ranges).
This slice owns the authoring UI and bone-level wiring; #525 owns the per-frame evaluation plumbing that runs constraints during playback. The split is intentional — bones own their constraint lists (this epic); the animation system owns "evaluate the constraint stack each frame" (the Anim epic). Both must coordinate scope before either lands.
Scope
Constraint types in this slice:
Look-at / Aim — bone rotates to point at a target.
Copy-rotation — bone copies another bone's rotation (full, or per-axis subset).
Copy-position — bone copies another bone's world/local position.
Parent-of — bone inherits transform from a non-hierarchical "parent" target (used for "weapon parented to hand" without changing the rig hierarchy).
Limit-rotation — clamp Euler ranges per axis (knees don't bend backwards).
Constraint stack per bone: ordered, evaluated top-to-bottom after the animation track is sampled. Each constraint has:
Round-trip: store constraints in the project file + glTF extras. FBX has its own constraint model but is lossy via Assimp's open-source path; document the lossy fields up front.
Live evaluation: integrates with the animation evaluation step. Constraint evaluation runs after the IK solver (Slice F) so an IK-driven bone can be further look-at-constrained on top.
Acceptance Criteria
Each constraint type behaves correctly on a fixture (head look-at follows a moving target; 2-bone copy-rotation mirrors).
Constraint stack ordering produces predictable results when constraints conflict.
Bake-to-keyframes flattens constrained motion cleanly into the source animation.
Does this slice land before or after #525? Recommended sequence: this slice's data model lands first (smaller surface area; just bone authoring), then #525 wires it into per-frame evaluation. Confirm at scoping.
Parent epic: #554
Coordinated with: #525 (Anim epic's constraint slice).
Goal
Bone-level constraints — the rigger's bread and butter outside of IK. Look-at (head tracking a target), copy-rotation (mirror another bone), parent-of (independent transform parenting), limit-rotation (clamp Euler ranges).
This slice owns the authoring UI and bone-level wiring; #525 owns the per-frame evaluation plumbing that runs constraints during playback. The split is intentional — bones own their constraint lists (this epic); the animation system owns "evaluate the constraint stack each frame" (the Anim epic). Both must coordinate scope before either lands.
Scope
Acceptance Criteria
scene.skel.constraint.*.Effort
~12 days, plus coordination time with #525.
Open question
Does this slice land before or after #525? Recommended sequence: this slice's data model lands first (smaller surface area; just bone authoring), then #525 wires it into per-frame evaluation. Confirm at scoping.