scenario-video-to-motion
About scenario-video-to-motion
A skill for turning video of people into 3D animation using Scenario video23d members. It guides model selection, input and output schema checks, job execution, and inspection of the resulting motion.
Key features
- 01Select video23d members
- 02Check input and output schemas
- 03Run and wait for jobs
- 04Support mesh animation or motion-only output
- 05Inspect facing, contact, and frame count
Use cases
- 01Applying a dance clip to a character mesh
- 02Extracting motion for an existing rig
- 03Preparing an animation export for a target engine
MCP support
Uses Scenario's video23d capability to submit footage and optional 3D meshes to model members, then wait for jobs and inspect or download results.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-video-to-motionAfter installing, type/scenario-video-to-motionin Claude Code to confirm it loaded.
Details
From the project READMEScenario Video to Motion
Overview
Video-to-motion members watch the people in a clip and return 3D animation: either your character
mesh, auto-rigged and moving, or the motion alone on a standard skeleton. They are the video23d
capability, and they differ more than their shared name suggests: which character input they take,
which skeleton comes back, and which file formats they write.
Siblings: scenario (connection, scope, upload, jobs_wait), scenario-3d (making or rigging the
mesh first), scenario-video (generating a reference performance when no footage exists), and
scenario-video-editing (trimming and resizing the clip). If a sibling skill named here is missing
from your available skills, ask the user to install it
(npx skills add scenario-labs/skills --skill <name>); unattended, proceed from tool schemas and
flag the gap.
Quick reference
| Step | Call | Watch for |
|---|---|---|
| Upload inputs | upload_asset with kind: "video", then kind: "3d" for a mesh | The mesh is optional on every member |
| Fit the clip | asset_get, then trim or resize per scenario-video-editing | Duration, size, and even-dimension limits per member |
| Pick a member | recommend with capability: "video23d" and the user's own words | Read next_step per the scenario skill |
| Read the inputs | model_schema_get | Each file field's kind, the output enums |
| Price, then run | model_run with dry_run: true, then wait: false | The video field carries cost_impact |
| Wait and inspect | jobs_wait, then asset_display | Facing, foot contact, and frame count |
Choose the output before the member
Three outcomes, and members cover different ones. Settle it with the user first (unattended: a character whose existing rig the project depends on takes motion only; otherwise animate the mesh).
- Your character, animated. A member takes the mesh, auto-rigs it, and applies the motion. The rig is the member's own: it does not retarget onto a skeleton the mesh already carries, so clips built for an existing rig need bone remapping.
- Motion only, on a named skeleton. A member returns the animation on a Mixamo-style or MetaHuman skeleton without uploading your character. Choose this when the character is already rigged. The file can include a template mesh: inspect it, then omit that mesh when retargeting onto the user's rig.
- Motion only, from a mesh member. Some mesh members also offer an animation-only flag, which drops the mesh from the download.
recommend ranks the members on measured cost and latency and names which take a character. Ask it
with the user's words, including the outcome above, rather than with a bare capability.
Read the schema, field by field
Field names repeat across members with different meanings, so read each field's kind before
filling it:
- One member's
characterFiletakes a 3D mesh; another member'scharacterFiletakes a reference image of the character, while its mesh field ischaracterModel. The field'skind(3dorimage), not its name, says which asset it takes. - Output formats differ: one member writes engine-specific FBX variants (
fbx-blender,fbx-unreal,fbx-roblox, Maya scene files), one a plainglborfbx(its schema namesfbxfor Unity), and one exposes no format field at all. Pick the engine target in the run:asset_download'sformatconversion is not documented to keep the animation. - An FBX export can be ASCII. Blender's legacy FBX importer rejects it; use its newer ASCII-capable importer. Check the imported animation before calling the file Blender-ready.
- Controls worth setting when present:
moveInPlacefor game locomotion driven by code,loopfor cycles, the frame rate field (namedframeRate,fps, ortargetFps), keyframe cleanup, and theforwardandupaxes when the motion arrives turned or lying down. - Some members track several people (
numPeople) or capture the face; both carrycost_impact.
Footage that captures well
- One person, full body in frame for the whole clip, feet visible, a static camera, no one crossing in front. Loose clothing and props hide joints.
- Trim to the move that ships: price follows the clip, and members cap the input. At authoring time
one capped it at 30 seconds and about 30 MB, another required even pixel width and height. Read
max_durationandmax_sizewhen exposed by the schema. An absent cap is not a promise of unlimited input. Fix an over-cap clip with the video editing tools before pricing. - No footage? Generate the performance with a video model per
scenario-video: a single full-body character on a plain background, a locked-off camera, and the action described beat by beat. The generated clip is then the input like any other. - Motion extraction targets human movement. A creature or a non-biped mesh needs checking frame by frame, and often a DCC pass.
Worked example: a dance clip on a game character
The user has a phone clip of a dance and a character GLB, and wants an Unreal-ready loop.
upload_assetthe clip (kind: "video") and the GLB (kind: "3d") per thescenarioskill.asset_getthe clip: read the duration and dimensions. Trim to the eight seconds that loop with the video cut tool, and resize to even dimensions if a candidate member requires it.recommendwithcapability: "video23d"and a prompt such as "apply the dance in this video to my uploaded character mesh, looping, exported for Unreal". Follownext_stepper thescenarioskill: presentask_useroptions; onproceed, take its pick without asking.model_schema_geton the pick. Put the GLB in the field whosekindis3d. Set the Unreal output target if the format enum has one,loop: true, andmoveInPlace: trueif the game moves the character itself.model_runwithdry_run: trueand quote the price. Then run withwait: false: these jobs take minutes. Retire it withjobs_wait, re-calling withpending_job_idson timeout.asset_displaythe result, or open it in a DCC. Check the facing, that the feet meet the ground, and that the loop point does not pop. If facing is wrong, checkforwardandupwhen the schema exposes them before blaming the capture. A preview link alone is not a visual check.asset_downloadwith noformat, and hand over the file with the skeleton it uses.
Common mistakes
- Expecting the motion on the character's existing rig: mesh members auto-rig from scratch. Use a motion-only member and retarget when the rig must stay.
- Filling a field by its name:
characterFileis a mesh on one member and an image on another. - Sending the full source video: the price grows with the clip, and over-cap clips fail.
- Converting the download to another 3D format instead of setting the export target in the run.
- Treating a sideways or upside-down result as a failed capture before trying the axis fields.
- Polling
job_getinstead ofjobs_wait, or re-running a job that only timed out.