Skip to content
←Back to Blog
From One Prompt to a Rigged 3D Performance: Inside prompt2rig's Video-to-Mixamo Pipeline
Motion Capture3D AnimationGenerative Video

From One Prompt to a Rigged 3D Performance: Inside prompt2rig's Video-to-Mixamo Pipeline

prompt2rig turns a text prompt into a generated performer clip, then reconstructs full-body and finger motion with browser MediaPipe and local GVHMR/WiLoR before retargeting to Mixamo and exporting GLB.

GitHubDaily · universal-modderOctober 26, 202614 min read67 views
ZH

Most text-to-motion demos ask a model to imagine joint rotations directly from language. prompt2rig takes a different route: it first asks a video model to act out the prompt as a person, then recovers the performance from those pixels and maps it onto a rigged character. The result is not a video of a robot or a polished final render. It is a playable skeletal animation that can be inspected in the browser and exported as a GLB for Blender or Unity.

The project is a useful case study because it exposes the entire chain rather than hiding it behind one endpoint. A hosted video model handles action generation, a browser-side MediaPipe pass provides an immediate preview, and a local GPU worker runs GVHMR and WiLoR for a cleaner body-and-hand pass. A separate retargeting layer converts both motion sources into Mixamo bone rotations. That division is simple enough to understand, but it also reveals where the system is strong and where it is still fragile.

The GitHubDaily demo linked in the source post. The left panel is the generated performer clip with pose landmarks; the right side is the same motion retargeted to a Mixamo character. The clips are short, frontal, and deliberately staged for single-camera pose estimation.

The core idea: generated video is an intermediate motion format

A conventional monocular motion-capture pipeline starts with a real recording. prompt2rig removes that constraint by generating the recording first. A text prompt is expanded with staging instructions, sent to a video model, and turned into a short clip of one performer. The clip then becomes the input to the same general class of algorithms used for video-based mocap.

This detour has one important benefit: the video model provides timing, silhouettes, limb trajectories, and hand poses without requiring a separate text-to-SMPL model. It also has a cost: every temporal inconsistency, impossible contact, extra finger, or limb overlap produced by the video model becomes an error for the pose estimator. prompt2rig tries to control that risk through a fixed performer image and a prompt template that strongly favors frontal, unobstructed motion.

prompt2rig browser interface with the generated performer video and landmark overlay on the left, a Mixamo character on the right, and a queue of generated takes along the bottom.
The browser application keeps the source clip, pose overlay, retargeted character, and queued takes visible in one workspace. The selected performer is produced once and reused as the visual anchor for later generations. Image: prompt2rig repository.

The full pipeline

StageWhere it runsWhat it produces
Performer imagefal, using fal-ai/flux/schnellA centered, full-body person on a plain studio backdrop
Video generationfal, using H3 Max Turbo or FLUX 3 MaxA 5 to 20 second clip that performs the requested action
Live previewBrowser, MediaPipe PoseA noisy but immediate landmark track suitable for playback while HQ is pending
HQ body passLocal FastAPI worker, GVHMRSMPL global orientation, 63 body-pose values per frame, translation, and leg length
HQ finger passLocal GPU, WiLoR or MediaPipe Hands21 keypoints per hand per frame, assigned to the body and expressed in world axes
RetargetingBrowser, three.jsLocal quaternion tracks for Mixamo bones plus a grounded hips path
ExportBrowser, GLTFExporterAn animated GLB containing bone tracks and hips translation
prompt2rig banner showing six pipeline examples, including side kick, cheer kick, tracked fingers, crane kick, Bollywood pose, and arabesque.
The repository positions prompt2rig as a prompt-to-performance tool rather than a general motion foundation model. Its examples emphasize clear, front-facing actions that preserve visible limbs and readable hand shapes. Image: prompt2rig repository.

Why the app generates a performer first

The browser starts with a generated photograph of one young adult in a neutral T-pose-like stance: full body visible, light-grey shirt, dark trousers, plain studio background, soft even lighting. This image is used as the first frame for image-to-video generation. The same character and framing can then be reused across prompts, while stream mode uses the previous clip's final frame instead.

That choice makes the downstream problem easier in three ways. It gives the video model a stable identity, it makes the person large enough in frame for pose crops, and it avoids scene cuts or camera motion. The prompt builder also appends constraints such as "both arms clearly visible and held away from the torso", "no turning around", "no flips", and "static locked-off camera". These are not cosmetic instructions. They prevent exactly the ambiguities that a monocular estimator cannot reliably resolve.

Live path: useful latency, limited geometry

MediaPipe Pose runs in the browser while the generated video plays. It returns 33 body landmarks and a set of world-space landmarks. The app converts those coordinates into three.js space, filters them with an adaptive One Euro filter, estimates torso scale from 2D shoulder and hip positions, drives the Mixamo rig, and records snapshots into a live animation track.

The strength of this route is latency. There is no server round trip and no multi-gigabyte checkpoint to start. The user sees a moving character almost immediately after the clip is ready. The weakness is geometric quality: monocular landmarks can jitter, depth is uncertain, limbs can exchange identity when they cross, and the world-space points are not a full body model. The app exposes smoothing controls and stabilizes root motion, but no filter can invent the missing depth.

HQ path: recover a body model over the whole clip

The HQ worker is deliberately shaped around clips generated by prompt2rig. A single-person, static-camera clip does not benefit from expensive multi-object tracking, so the worker batches a YOLO11m detector, keeps the largest person in each frame, fills short detection gaps, and smooths the crop boxes. Frames are reused between detection and cropping instead of being decoded twice. The long side is capped at 854 pixels because GVHMR ultimately operates on small person crops, and the clip is resampled to 30 fps.

GVHMR then recovers a sequence of SMPL parameters with a fixed-proportion body and a gravity-aware root trajectory. The worker returns the global orientation, the first 63 body-pose values per frame, translation, and a measured leg length. It also returns the first frame's orientation relative to the camera so chained clips can preserve a consistent heading. Because GVHMR looks at the clip as a sequence rather than solving each frame independently, it can reduce the limb stretching and forearm twisting that appear in frame-by-frame landmark retargeting.

The implementation contains several application-specific speedups. Batched detection replaces frame-by-frame tracking, ViTPose runs without its mirror flip-test by default, CUDA work stays on one warm thread, and the input resolution is reduced before body recovery. The README reports roughly 10 seconds for the stock GVHMR path and about 3.4 seconds after these changes for a 5-second clip on an RTX 4090.

Hands are tracked as a separate geometric problem

Body models usually stop at the wrist. prompt2rig therefore runs a hand detector and pose model on the full-resolution source clip while GVHMR processes the body. It supports WiLoR with MANO, or MediaPipe Hand Landmarker as a lighter fallback. Each detected hand is represented by 21 keypoints in the MediaPipe and OpenPose ordering: wrist, four thumb points, and four points for each remaining finger.

Assigning those hands to the body is part of the work. The hand model reports handedness inconsistently, while the body keypoints provide a more stable notion of left and right. The code assigns each detected hand to the nearest body wrist, mirrors left-hand crops for WiLoR's right-hand prior, un-mirrors the resulting pose, and resamples the track to the body motion's frame rate.

Camera coordinates also have to be rotated into GVHMR's world frame. The worker constructs a per-frame mapping from the world and camera-space pelvis orientations:

$$R_{w \leftarrow h}(t) = R_{w \leftarrow c}(t)R_{c \leftarrow h}(t)^T$$

Here the two source rotations describe the body's pelvis in world and camera coordinates. The resulting matrix is applied to wrist-relative hand points, which allows the fingers to move with the recovered 3D world while keeping the palm attached to the wrist.

Missing hand detections are tolerated rather than hidden. Gaps up to 0.4 seconds can be interpolated, longer invalid stretches remain marked as invalid, and each valid run is smoothed independently with a Gaussian filter using a standard deviation of 1.2 frames at 30 fps. When a hand is absent, the retargeter produces a relaxed curl instead of a rigid flat hand.

The retargeter drives 15 bones per hand, three for each finger, by aiming each bone at the measured segment direction. It does not force every finger to fold along one palm normal. Instead, it constrains backward bending and caps knuckle and joint bends at anatomically plausible angles. WiLoR's MANO output is treated as already valid and bypasses the stronger MediaPipe joint limits.

Retargeting: rotations first, dimensions second

The body path maps the 22 SMPL joints directly onto Mixamo names such as Hips, Spine, LeftArm, RightUpLeg, and LeftToeBase. The target character's rest pose supplies a hip basis and a chest basis, and the source's world rotations are converted into local bone quaternions. The hips path is translated into the target's coordinate frame and scaled by the ratio between the character's leg length and the recovered performer's leg length.

$$s = \frac{L_{\mathrm{rig}}}{L_{\mathrm{human}}}$$

After retargeting, the code checks the lowest foot against the rest-pose floor and raises the hips if a foot would penetrate it. This is a useful correction, but it is not a contact solver: sliding, penetration during a jump, and pressure distribution are still not modeled.

For the live path, the One Euro filter smooths MediaPipe landmarks before solving the rig. The HQ path is already smoother, so the browser simply samples the recovered track and cross-fades from the live animation to HQ over 600 milliseconds. Character switches use a shorter 250-millisecond blend. Animated GLB export samples the best available track into local rotation keys plus a hips position track, then uses three.js GLTFExporter to write a binary GLB.

Stream mode and its cumulative risk

Stream mode turns separate generations into an approximate continuous performance. Each generation uses the previous clip's final frame as its image-to-video conditioning. The app holds the last pose while the next HQ result is pending, starts another take on the live pass if the queue is starving, and inserts short idle clips between prompts. Horizontal root offset is carried from one take to the next and capped at 2.5 meters.

This produces a much more coherent demo than restarting from the same neutral image every time, but it inherits two sources of drift. The video model can gradually change identity, costume, or body proportions, and the previous last frame does not guarantee a physically continuous next action. Stream mode is therefore best understood as visual stitching with motion-aware playback, not as a long-horizon world model or a guarantee of seamless contact.

Measured speed

OperationConfigurationReported time
Fast video generationH3 Max Turbo, 480P, 5 secondsAbout 2 to 3 seconds wall time, 0.5 seconds GPU
Higher-fidelity videoFLUX 3 Max, 720p, 5 secondsAbout 8 to 9 seconds wall time, 4.5 seconds GPU
HQ body recoveryGVHMR, RTX 4090About 3.5 to 4 seconds
Finger trackingWiLoR, parallel with GVHMRAbout 0.3 seconds additional

These are author-reported timings for generated, single-person clips on a tuned Windows 11 machine with an RTX 4090. They should not be read as general throughput numbers. FLUX 3 has a minimum five-second duration in the server wrapper, while H3 accepts shorter clips; model-provider queueing, download time, and first-run CUDA initialization are separate from the stated GPU inference figures.

Where the pipeline is likely to fail

The central limitation is not the neural network choice but the input assumption. The system expects one person, a static camera, a clean background, a visible full body, and limbs that remain separable. Turning, spinning, flips, floor work, crossed arms, occluded hands, loose clothing, and unusual camera angles all stress the wrong parts of the stack. The prompt template avoids those cases because pose estimators can swap left and right, lose depth, or hallucinate a limb behind the torso.

Correct-looking rotations also do not imply physical validity. prompt2rig grounds the lowest foot and applies finger hinge limits, but it does not solve contact, torque, center of mass, or hardware joint limits. There is no published quantitative benchmark for natural long-form motion, hand accuracy, foot sliding, or sim-to-real transfer. The demos establish that the pipeline can produce compelling short clips; they do not establish the accuracy of a motion-capture product.

The Windows and NVIDIA requirement is another practical boundary. The browser half runs with Node alone, but the recommended HQ pass depends on a local CUDA environment, roughly 5 GB of GVHMR checkpoints, a registered SMPL-X body model, and optionally MANO and WiLoR weights. This is not a zero-install web application.

Why robotics teams may still care

The most relevant robotics pattern is the separation between motion generation, motion recovery, retargeting, and execution. A robot learning stack might replace the generated video with a human demonstration, replace Mixamo with a humanoid, and replace the export step with a trajectory and controller. The project demonstrates a practical front end for turning a video into articulated motion while keeping the intermediate body representation inspectable.

It also shows the boundary that remains after mocap. A humanoid needs contact schedules, center-of-mass consistency, joint velocity and torque limits, collision-aware retargeting, and a controller that can recover when the planned motion is infeasible. prompt2rig is not a robot-control system, a dynamics model, or a validated sim-to-real pipeline. It is a browser-native content and prototyping tool whose retargeting ideas may be useful upstream of those systems.

Running it

git clone https://github.com/blendi-remade/prompt2rig
cd prompt2rig
cp .env.example .env
# add FAL_KEY to .env
node server.mjs

That launches the web app and the MediaPipe live path at http://localhost:5177. For the HQ path on Windows, run hq\setup.ps1, install SMPLX_NEUTRAL.npz under hq/body_models/smplx/, optionally install MANO through hq\setup_hands.py, then start hq\.venv\Scripts\python hq\worker.py. The worker listens on 127.0.0.1:5178 and stays warm across requests.

Licensing is the most important deployment constraint

ComponentLicense statusPractical implication
prompt2rig codeApache-2.0The project's own code is permissive
GVHMREducational, research, and non-profit use onlyThe HQ body path is not cleared for commercial use
SMPL-XNon-commercial registration; commercial license separateA commercial product must license the body model
WiLoRCC-BY-NC-NDThe HQ finger path is non-commercial
MANONon-commercial registrationCommercial use requires a separate license
Ultralytics YOLOAGPL-3.0 or commercial licenseNetwork deployment can trigger copyleft obligations

The README is unusually explicit about this split: the web interface, live MediaPipe preview, and hosted video generation can be commercially usable under their respective terms, but the recommended HQ body-and-hand stack is research-oriented. A company planning to ship this pipeline must replace or separately license GVHMR, SMPL-X, WiLoR, MANO, and the detector. Calling the repository "Apache-2.0" without that qualification would be misleading.

What prompt2rig demonstrates

prompt2rig is convincing because it connects mature pieces with clear contracts. Video generation supplies an expressive but unreliable observation. MediaPipe supplies speed. GVHMR supplies a coherent body model. WiLoR supplies fingers. The retargeter supplies a common skeleton interface, and GLB export makes the result useful outside the demo. The engineering work is mostly in the seams between those stages: staging, coordinate frames, handedness, scale, smoothing, blending, and invalid-data handling.

That is also the right way to read the demo. It is not evidence that text alone now produces production-grade motion capture. It is evidence that a generated clip can become an editable, rigged 3D performance with a relatively small orchestration layer, provided the scene is constrained and the underlying model licenses fit the intended use.


Source: GitHubDaily on X, "One prompt to full-body 3D motion with fingers", and the blendi-remade/prompt2rig repository. The article was written from the linked repository's README, server, retargeting, HQ worker, hand-tracking, and Blender export source. The public video remains available in RobotWorld's existing X demo record; this article adds the full bilingual technical analysis rather than duplicating the short video card.

As an Amazon Associate, we earn from qualifying purchases.