Motion catalog
Human-readable map of every motion id in configs/motions.json — what it looks like, its playback policy, and the source clip it was extracted from. Keep this in sync with the registry.
- Sources: clips come from three origins.
- Mate Engine (Shiny) — the bulk set, extracted from the Unity project (
Assets/MATE ENGINE - Animations/…) to.vrmavia theunity-cli exec → YuiExport.YuiVrmaExport.ExportBatchpipeline (30 FPS, T-pose reference, model-independent retarget). Used under Mate Engine's non-commercial terms — attribution to Shiny required; commercial use needs separate permission. - necocoya — EmoteSet_Free_v130 —
sulkonly (Unity Humanoid06_suneru, 拗ね = sulk/pout). Attribution to necocoya required; modification/conversion and bundling-with-credit are permitted, standalone resale of the raw file is prohibited. - もいらんど — thinking —
thinkingonly. A purchased licensed asset kept atpublic/purchased_motions/thinking.vrma, gitignored and never committed to a public repository (seepublic/purchased_motions/AGENTS.md). When the file is absent locally, the renderer falls back toidle. - Mixamo —
walk("Walking", in-place),jump("Jump", in-place),falling("Falling_2"),landing("Falling_and_landing"), and the climb setclimb_up("Climbing Up Wall"),climb_up_done("Climbing To Top"),climb_down("Climbing Down Wall"),climb_down_landing("Climbing Down_landing"), and the seat transitionssit_down("Sitting"),stand_up("Sit To Stand"). Royalty-free under the Mixamo terms; converted to.vrmathrough the Mate-EngineYuiExport.YuiVrmaExportpipeline (30 FPS) with a with-skin (bind-pose) source avatar;jump, the fall pair, the climb set and the seat transitions are exported from the "Maria WProp J J Ong" character.
- Mate Engine (Shiny) — the bulk set, extracted from the Unity project (
- Durations are the source clip length.
- Pools:
idle,idle_lively,window_sit,danceare single registry entries with avariants[]list andvariant_policy: "random"— each trigger plays a random variant (immediate-repeat avoided). The character-facing id is the pool id; individual variant files are not separate registry entries. - Triggers: AI via
generate_expressmotion_idplays any broker-published oneshot/pool;idleis the ambient baseline;dragis the reactive pickup;head_patloops while a press is held on the head region;window_sitis a held state engaged by a dev trigger;thinkingis a client-played TTFT latency affordance (loops from the start of a backend turn until the response speech begins);walkis the ambient floor or foreign-window-top stroll, played by the client's walk schedulers while the OS window translates along the supporting edge — the floor stroll runs whenever the body is onidle,thinking, orwalk, through a turn's thinking, its filler and its response speech (expressions and lip-sync apply as they arrive), and ends in place when a responsemotion_idtakes the body; a floor stroll may continue past its own monitor's edge onto a neighbouring monitor that shares its floor line and scale factor, the window translating frame by frame; a stroll that starts over a stretch where the window would hang over a monitor beneath it with a different scale factor instead parks the OS window once over the whole path, moves the character inside the parked canvas, and parks the window once more where she lands; a reflex turn cancels it at once, and the perched stroll and the climb still yield to any turn in flight;jumpis played by the client when the perched stroll crosses a height difference or a gap to an adjacent window's top while the OS window travels the arc — a neighbour whose top is level with the host's withinperch_walk.level_tolerance_pxand overlaps or touches it is one ledge with the host, and the stroll's own leg walks across the seam onto it;fallingandlandingare the fall chain, played by the client whenever the character is left in mid-air — a drag release that misses, a perched sit that loses its host window, a jump that loses its target, and the ambient step-off that walks a perched stroll off the outer edge of the ledge it is on — and the window drops to the first landing surface below it: a foreign window top with standing room either side, or the work-area floor of the monitor under the feet — except that a drag release whose feet hang below the floor line of a monitor above them by less thanfall.min_drop_fraccharacter heights lands on that line instead of falling down the monitor below;climb_up,climb_up_done,climb_downandclimb_down_landingare the climb chain, played by the client's climb scheduler while the OS window travels up or down a foreign window's side edge; the screen edges of a monitor that has another monitor directly above it are climb targets alongside window sides; that ascent parks the OS window once over the whole climb, moves the character inside the parked canvas, and parks the window once more standing on the upper monitor's floor line rather than on a seat. A floor segment ending over a lower monitor has a descent edge at that monitor's screen edge; at stroll planning time,descend.chancechooses whether she walks there and descends. On arrival,descend.climb_down_chancechooses between climbing down toclimb.descent_wall_offset_fraccharacter heights inside the edge and walkingfall.land_room_fraccharacter widths beyond it before falling; the whole descent uses one parked travel frame.sit_downandstand_upare the seat transitions, played by the client's sitter on every seat entry (a drag drop onto a window top, a climb that reaches the ledge, a perched stroll sitting back down, a fall that lands on a window top) and on the voluntary seat exits (a perched stroll standing up, a climb descent leaving the seat) — a drag pickup and a lost host window leave the seat at once, with no stand-up. - Broker publication (
broker_publish, defaulttrue): afalseentry stays renderable locally but is kept out of the agent-facing broker vocabulary, so the agent never selects it. The broker-published, agent-selectable set ishappy, laugh, embarrassed, sheepish, calm, sleeping, idle_lively, dance, sulk. Excluded from the broker:idle(ambient baseline, auto-played),drag(kind: reactivepickup),head_pat(kind: reactivepat loop),peekandwindow_sit(broker_publish: false, client-held perch states),thinking(broker_publish: false, client-played TTFT affordance),walk(kind: reactive+broker_publish: false, the client-scheduled ambient stroll),jump(broker_publish: false, its window-to-window crossing),falling,landing(broker_publish: false, the client-owned fall chain), andclimb_up,climb_up_done,climb_down,climb_down_landing(broker_publish: false, the client-owned climb chain), andsit_down,stand_up(broker_publish: false, the client-owned seat transitions). - Idle selection: each
idlevariant carries an on/off switch in the Character tab. The selection is a localStorage overlay (yui.idle_motions, the disabled set keyed by variant file path) —configs/motions.jsonis never written. The ambient cycle picks only from the enabled variants and re-reads the selection on every rotation, so a change lands after the playing variant finishes its cycle. The pool'svrma_path(calm.vrma) is the fallback baseline and cannot be disabled. - Expression selection: each broker-published motion carries an on/off switch in the Character tab, grouped by category. The selection is a localStorage overlay (
yui.express_motions, the disabled set keyed by motion id) —configs/motions.jsonis never written. It narrows the vocabulary published to the broker and themotion_idenum of the Chat-Completionsgenerate_expresstool; turning every motion off dropsmotion_idfrom that schema. It is a vocabulary filter, not a render gate: a cue naming a deselected motion still plays. - Vertical root lock (
root_lock_y, defaultfalse): the loader strips a clip's baked horizontal root drift from every entry, but leaves vertical motion alone because that is the bob. Atrueentry has its hips-Y track levelled instead — every key onto the hips height the VRM has in its rest pose — and the curve that came out is kept beside the clip. Set on the four climb clips and the two seat transitions, whose rise and fall is the movement: the OS window replays that curve, so the clip and the window compose to the authored motion exactly once, a loop has no seam left to snap at, and a clip captured with the hips a metre above standing no longer plays a metre up the canvas. The flag rides in the clip-cache key, so two entries sharing one.vrmacan disagree on it. - Missing-clip fallback: any motion whose clip fails to load (missing or invalid
.vrmafor the live VRM — e.g. a gitignored purchased motion absent locally) recovers toidle. The renderer force-commitsidleso the failed id never pins controller state or blocks a later idle by priority.
Naming convention
A motion id is named for the emotion or state it expresses, with a few patterns:
- Default —
{emotion}: the bare emotion or state —happy,laugh,embarrassed,sheepish,calm. - Indexed —
{emotion}_NN: when several clips express the same id, suffix a zero-padded number (idle_01,dance_13,sit_01). - Descriptive exception: motions whose action or pose is itself the clearest identifier keep that descriptive name instead of an emotion label —
idle,drag,head_pat,peek,window_sit,sleeping,thinking,walk,jump,climb_up,climb_down,dance.
Top-level motions
| id | kind | loop | description | source clip | ~len |
|---|---|---|---|---|---|
idle | ambient | yes (cycle) | Calm ambient baseline — random pool of calm.vrma and the three calmest idle variants (see below). pingpong: true with loop_cycles: [1, 3]: each variant plays forward↔reverse a random 1–3 round trips, then rotates to a fresh variant. | PET_POSE / PET_IDLE / PET_MISC | — |
idle_lively | oneshot | no | Broker-published random lively-fidget pool (see below). Plays one variant once, then returns to the prior stable motion. | PET_IDLE / UPDATE_2 | — |
drag | reactive | yes | Pickup reaction while the window is being dragged. broker_publish: false. | PET_MISC/PET_DRAGGING | — |
head_pat | reactive | yes | Head-pat reaction, held for as long as the press stays on the head region. pingpong: true (single variant): plays forward↔reverse continuously until the release clears it. broker_publish: false. Reuses idle_10.vrma as the pat loop. | PET_IDLE/PET_IDLE_10 | 11.0s |
falling | reactive | yes | Falling loop, held for the whole descent to the surface below. broker_publish: false. | Mixamo "Falling_2" | 2.78s |
landing | oneshot | no | Touchdown at the end of a fall, then recover to standing. A fall that came down on a window top takes its seat once this clip hands the body back. broker_publish: false. | Mixamo "Falling_and_landing" | 7.18s |
climb_up | reactive | yes | Wall-climb loop held for the length of an ascent. root_lock_y: true: the clip's rise per cycle comes out of the hips and goes into the window, so the VRM climbs in place at scene origin while the OS window rises along the chosen window edge and the root yaws ±90° toward the wall. The window tracks the clip's own rise curve, counting each loop restart, so the hands do not slide. broker_publish: false. | Mixamo "Climbing Up Wall" | 1.98s |
climb_up_done | oneshot | no | Pull-over onto the ledge that ends an ascent. root_lock_y: true: the window follows the clip's own rise, leaving the feet on the window's top edge. broker_publish: false. | Mixamo "Climbing To Top" | 4.0s |
climb_down | reactive | yes | Wall-descent loop held for the length of a descent, root_lock_y: true, the window following the clip's own ~1.05 m per cycle. It also covers the step off the ledge: the clip crossfades in over a 400 ms slide down the wall, which is the one stretch the window drives on its own clock. broker_publish: false. | Mixamo "Climbing Down Wall" | 2.0s |
climb_down_landing | oneshot | no | Touchdown at the end of a descent. root_lock_y: true: the window follows the clip's own ~0.24 m drop onto the work-area floor. broker_publish: false. | Mixamo "Climbing Down_landing" | 1.38s |
sit_down | oneshot | no | Sitting down onto a window top, played before window_sit takes the seat. root_lock_y: true: the perch pin stays off while the clip plays and the window follows the clip's own hips curve, scaled so its total drop is the measured standing-feet → seated-hips distance — the last frame lands the hips on the edge, then window_sit crossfades in and the pin engages. A drag drop keeps the window where the user left it and plays the clip in place. broker_publish: false. | Mixamo "Sitting" | 4.4s |
stand_up | oneshot | no | Standing up from a window seat, played before a perched stroll or a climb descent leaves the seat. root_lock_y: true: the pin is released and the window follows the clip's rise, scaled to the same seat distance, so the feet end on the edge. broker_publish: false. | Mixamo "Sit To Stand" | 2.03s |
happy | oneshot | no | Happy reaction. | PET_MISC/PET_HAPPY | — |
laugh | oneshot | no | Laughing reaction. | PET_MISC/PET_LAUGHING | — |
embarrassed | oneshot | no | Strongly embarrassed; shy finger-point gesture. | PET_MISC/PET_SHY_POINT | — |
sheepish | oneshot | no | Sheepish/awkward standing gesture; one hand raised to the head/hair. | PET_POSE/PET_POSE_2 | 6.8s |
calm | oneshot | no | Calm standing gesture; hands folded together in front. | PET_POSE/PET_POSE_3 | 5.0s |
peek | state | yes (cycle) | Held while side-perched; the hips stay pinned inside the app-window edge so the clip's walk-away never leaves frame, and the clip mirrors on its configured side. crossfade_loop: true: the clip clamps on its last frame and crossfades back to frame 0 (fade_ms: 700) each loop, hiding the wrap seam. broker_publish: false. | PET_HIDING/PET_HIDE | 14.0s |
sleeping | oneshot | yes | Lies down on the floor on her side — sleeping. Drops the hips low (off a feet-anchored frame). | PET_SLEEPING/PET_SLEEPING | 35.2s |
thinking | state | yes | Looping thinking pose — client-played TTFT latency affordance; loops from the start of a backend turn until the response speech begins. pingpong: true (single variant): plays forward↔reverse continuously, seam-free at the turnaround, until interrupted. Priority 50 (above idle, below window_sit perch and reactive emotes). broker_publish: false. Purchased asset at public/purchased_motions/thinking.vrma; falls back to idle when absent. | もいらんど thinking | — |
sulk | oneshot | no | Sulk/pout (拗ね) emotion gesture. | necocoya EmoteSet_Free_v130 / 06_suneru | 4.2s |
walk | reactive | yes | In-place walk cycle (39 keyframes at 30 FPS) held for the length of an ambient stroll. The VRM stays at scene origin while the OS window translates along the work-area bottom and the root yaws ±90° toward the travel direction; the window is paced at 1.34 m of stride per cycle, divided by the loaded clip's own duration, so the feet do not slide. Priority 45 (above idle, below thinking and the emote oneshots, which end the stroll by taking the clip). kind: reactive keeps it out of the return target a finishing oneshot resumes, so a stroll cut short never leaves the character walking on the spot. broker_publish: false. | Mixamo Walking | 1.27s |
jump | oneshot | no | Standing jump, played once when a perched stroll crosses a height difference or a gap to an adjacent window's top. The VRM jumps in place at scene origin while the OS window travels a parabola between the two tops over the clip's airborne stretch (0.40–0.67 of its length); the crouch and the recovery play with the window held still. Priority 45, above the idle baseline the walk hands the body back to before takeoff and below the drag pickup that ends the jump. broker_publish: false. | Mixamo "Jump" | 1.6s |
window_sit | state | yes | Held window-perch (see below). Plays a sit variant, pingpong: true with loop_cycles: [1, 3] (forward↔reverse a random 1–3 round trips), crossfades to a different variant, repeats until interrupted. broker_publish: false. Engaged by a dev trigger. | PET_SITTING/* | — |
dance | oneshot | no | Random dance pool (see below). | PET_DANCING/* | — |
sheepishandcalmare standing gestures, not sitting.
idle variants (ambient baseline pool)
4 variants.
| variant file | description | source clip | ~len |
|---|---|---|---|
| calm.vrma | Calm standing gesture; hands folded together in front. | PET_POSE/PET_POSE_3 | 5.0s |
| idle_01.vrma | Standing, hands framed together at the chest, slight turn — playful. | PET_MISC/HoverReaction | 2.5s |
| idle_04.vrma | Standing, 3/4 turn, one hand raised to touch her hair — coy. | UPDATE_2/PET_IDLE_UPDATE2_03 | 11.4s |
| idle_12.vrma | Standing, weight shifted onto one hip, subtle head tilt and knowing smile — sultry calm. | PET_IDLE/PET_IDLE_12 | 3.5s |
idle_lively variants (oneshot, random)
10 variants.
| variant file | description | source clip | ~len |
|---|---|---|---|
| idle_02.vrma | Standing, arm lifts to the chin then crosses at the chest, cape swirling — energetic. | UPDATE_2/PET_IDLE_UPDATE2_01 | 16.5s |
| idle_03.vrma | Standing, one arm raised high in an open-palm wave — cheerful greeting. | UPDATE_2/PET_IDLE_UPDATE2_02 | 13.2s |
| idle_05.vrma | Standing, both arms thrown overhead in a big stretch, cape flaring wide — energetic. | UPDATE_2/PET_IDLE_UPDATE2_04 | 12.0s |
| idle_06.vrma | Standing, quick half-turn with a leg cross and hip dip, hair swinging out — playful twirl. | PET_IDLE/PET_IDLE_6 | 5.7s |
| idle_07.vrma | Standing, glancing back over the shoulder with one hand raised in a small wave, hair swept aside — flirty. | PET_IDLE/PET_IDLE_7 | 9.3s |
| idle_08.vrma | Standing, arms sweep open wide then settle back at sides, sleeves fluttering — breezy sway. | PET_IDLE/PET_IDLE_8 | 6.0s |
| idle_09.vrma | Hands on hips, confident smirk, quick turn sends hair whipping to the side — playful, sassy. | PET_IDLE/PET_IDLE_9 | 10.0s |
| idle_10.vrma | Side turn, hair caught in a windswept flick, hands settle clasped behind the back — coy, flirty. | PET_IDLE/PET_IDLE_10 | 11.0s |
| idle_11.vrma | Standing, hands raised to shoulder height with fingers curled like claws, playful jab — feisty. | PET_IDLE/PET_IDLE_11 | 4.1s |
| idle_13.vrma | Standing, glances back over the shoulder then leans in with hip cocked — flirty tease. | PET_IDLE/PET_IDLE_13 | 4.1s |
window_sit variants (random)
7 variants — a mix of floor sits and edge/perch sits. All lower the hips when seated. window_sit is a looping held state that ping-pongs each variant forward↔reverse a random 1–3 round trips (loop_cycles: [1, 3]), then crossfades to a different variant over fade_ms: 700 with no settled-frame dwell (cycle_dwell_ms: 0).
| variant file | description | source clip | ~len |
|---|---|---|---|
| sit_01.vrma | Floor sit, legs folded to one side, one hand supporting — elegant. | PET_SITTING/ME_02/PET_SIT_01 | 3.2s |
| sit_02.vrma | Sits upright on an edge, knees together — best for window-perch. | PET_SITTING/ME_02/PET_SIT_02 | 6.5s |
| sit_03.vrma | Sideways floor sit, hand to chin — cute. | PET_SITTING/ME_02/PET_SIT_03 | 6.5s |
| sit_04.vrma | Edge sit, knees together, hands resting on lap — demure. | PET_SITTING/ME_02/PET_SIT_04 | 2.0s |
| sit_05.vrma | Cross-legged floor sit, one hand to the head — relaxed/casual. | PET_SITTING/ME_02/PET_SIT_05 | 4.0s |
| suwari1.vrma | Compact floor sit, knees drawn up. | PET_SITTING/ME_02/suwari1 | 3.2s |
| suwari3.vrma | Floor sit leaning back, one hand propped behind — relaxed. | PET_SITTING/ME_02/suwari3 | 2.9s |
dance variants (oneshot, random)
13 variants, ranging from short gestures (~1.3s) to full routines (~27s).
| variant file | description | source clip | ~len |
|---|---|---|---|
| dance_01.vrma | Energetic — both arms spread, scarf flowing. | PET_DANCING/PET_DANCING | 14.2s |
| dance_02.vrma | Short — hands at the waist. | PET_DANCING/PET_DANCING_2 | 1.3s |
| dance_03.vrma | One hand reaching out to the side, legs apart. | PET_DANCING/PET_DANCING_3 | 3.9s |
| dance_04.vrma | Idol-style — hands in fists near the chest. | PET_DANCING/PET_DANCING_4 | 2.3s |
| dance_05.vrma | Subtle hand gesture. | PET_DANCING/PET_DANCING_5 | 1.7s |
| dance_06.vrma | Weight-shift step, one arm crossed to chest. | PET_DANCING/PET_DANCING_6 | 2.4s |
| dance_07.vrma | Medium routine (calmer). | PET_DANCING/PET_DANCING_7 | 5.0s |
| dance_08.vrma | One arm extended, scarf flaring dramatically. | PET_DANCING/PET_DANCING_8 | 2.4s |
| dance_09.vrma | Raised hand / wave-like move. | PET_DANCING/PET_DANCING_9 | 4.5s |
| dance_10.vrma | Long full routine, expressive. | PET_DANCING/PET_DANCING_10 | 21.8s |
| dance_11.vrma | Longest — full routine with spins. | PET_DANCING/PET_DANCING_11 | 27.4s |
| dance_12.vrma | Gentle, cute. | PET_DANCING/PET_DANCING_12 | 6.3s |
| dance_13.vrma | Celebratory — both arms raised in a V. | PET_DANCING/PET_DANCING_13 | 19.6s |