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
The figure could bend, reach, hinge, and grip but was bolted to one spot
facing one direction — so pirouettes, grapevines, box-steps, traveling
combos, and walk cycles were all impossible, the biggest ceiling for
dance and locomotion. This adds two per-phase primitives that let the
figure turn and move across the floor:
- `turn: <deg>` rotates the figure's facing (yaw about vertical).
- `travel: <x> <z>` moves it across the floor (world metres from the
load spot).
Both are absolute targets carried forward across phases (like joint
angles) and both return home on the loop wrap, so a box-step traces a
square back to start and a pirouette spins a clean full turn.
Plumbing mirrors the existing reach/pin primitives end to end: parser
(parseStepChild + AstStep), schema, IR (Phase.turnDeg / Phase.travel,
travel clamped to a ±3m studio footprint), timeline (yaw/pos accumulate
alongside joints and interpolate with the same eased param), and the
renderer, which layers the sampled yaw and X/Z offset onto the base root
each frame before ground-lock. It composes cleanly because the feet
ground-lock only corrects the root's *vertical* height, never X/Z — so
the figure turns and steps while its feet still rest on the floor.
Loop seamlessness: the wrap keyframe returns facing to the NEAREST FULL
TURN to the final yaw rather than to 0, so a completed 360° pirouette
holds its facing through the reset (360°≡0° at the loop boundary) instead
of visibly un-spinning backward.
Scope: standing poses only — combining turn/travel with lying/seated
bases (whose root is already tilted) is documented as out of scope, like
the existing seated+hinge limit.
New movements (7): pirouette, box-step, grapevine, waltz-box, chasse
(Dance) and walk-cycle (a walk-out/about-face/walk-back) + quarter-turns
(Locomotion). Camera framing widens by the movement's travel extent so a
traveling figure stays in view.
Verified: 152/152 tests pass (13 new parser/render tests for turn/travel
sampling, clamping, and the home default); every example parses ROM-clean;
a full Playwright sweep of all 72 movements confirms the figures actually
turn and travel (live pelvis X/Z + root yaw telemetry) and that grounding
holds with zero floor-clipping — the additive change regressed none of
the existing 65 movements.
|**Dance / choreography**| Notating sequences, port de bras, simple phrases | 🟡 Simple gestures work; precise reach + partner work are future. |
20
+
|**Dance / choreography**| Notating sequences, port de bras, phrases that turn & travel | ✅ Phrases, port de bras, pirouettes, and traveling combos (box-step, grapevine, chassé) work via `turn`/`travel`; partner work is future. |
21
21
|**Martial arts**| Stances, strikes, basic forms | 🟡 Stances/strikes partly work; contact and weapons are future. |
22
22
|**Sign language / gesture**| Finger-spelling, signs, expressive gesture | ⛔ Needs a hand/finger rig (the rig currently ends at the wrist). |
23
23
@@ -43,7 +43,14 @@ These are the unlocks, roughly in order of leverage:
"ground-lock": "Pins effectors (hands / feet) to the floor for this phase.",
40
40
reach: "Drives an effector to a target via IK — `reach: hand_left ankle_left`.",
41
41
pin: "Moves the body so an effector sits on an anchor — `pin: hand_left bar` (hang, pull up, step up, dip).",
42
+
turn: "Turns the figure to face a new direction — `turn: 360` (degrees, yaw about vertical). Absolute, carried across phases. Standing poses only.",
43
+
travel: "Moves the figure across the floor — `travel: 0.4 0` (world x z metres from the start spot). Absolute, carried across phases. Standing poses only.",
42
44
cue: "A short coaching cue shown while this phase plays.",
43
45
hold: "Keep the joint at its neutral / rest angle.",
0 commit comments