HybridMaMoMask Generate
Type 'a person walks forward and turns around', get an actual 3D skeleton doing it
- model
- motion
This is the node you actually came for. Give it a sentence like "A person walks forward and turns around." and it returns a 22-joint human motion sequence: per-frame joint rotations plus root position at 20 fps, ready to preview in 3D or export to FBX. It's text-to-3D-motion in ComfyUI, which is a genuinely different thing from text-to-video - you get clean, riggable motion data instead of rendered pixels.
How it works
Under the hood this is the HybridMaMoMask research model (a "Hybrid Transformer-Mamba" text-to-motion architecture, from the Chetanaa/T2M Hugging Face Space, MIT). The Generate node walks the four-stage pipeline:
- Length estimator - the text gets CLIP-encoded (ViT-B/32) and a small model predicts how many frames the motion should be. This is the default; it's what runs when
duration_secondsis 0. - Hybrid mask transformer - generates motion tokens with iterative parallel decoding, the number of refinement passes being your
timestepssetting. - Residual transformer - refines those tokens across six residual-quantization levels, which is where the "texture" of the motion gets filled in.
- RVQ-VAE decoder - turns tokens back into the continuous 263-dimension HumanML3D motion format, then
recover_from_ricconverts it to XYZ joint positions.
Every stage is seeded from your seed, so same text + same seed = same motion. It's fully local - no API, no key.
The inputs that matter
text- the prompt. Keep it to simple, physically-plausible actions. The model trained on motion-capture descriptions (HumanML3D), so "walks forward and turns around" works far better than flowery prose.seed- your motion lottery ticket.duration_seconds(default 0) - 0 means "let the length estimator decide." Set it to force a specific length, but it caps at 9.8 seconds (~196 frames at 20fps).timesteps(default 18, up to 64) - decoding refinement passes. More = higher quality and slower. 18 is a sane start; drop to ~8-10 while iterating on the prompt, crank it for the final pass.cond_scale(default 4) andres_cond_scale(default 5) - classifier-free-guidance strength for the main and residual transformers. Higher = more prompt adherence, less natural motion; the defaults are where most people live.temperature(1.0) andtopk_filter_thres(0.9) - sampling randomness and truncation. Lower temperature tightens the motion, higher makes it wander.gsample(false) - a different sampling path for the mask transformer; leave it alone until you know why you want it.
Output is a single motion socket of type HYBRID_MAMOMASK_DATA - not an image, not a latent. It wires into HybridMaMoMask Preview Animation (3D) to watch, or HybridMaMoMask Export FBX to save.
Installing it
It's part of Link Comfy Nodes (Mister-Link/link-comfy-nodes). Install the pack - ComfyUI Manager, search "Link Comfy Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Mister-Link/link-comfy-nodes
cd link-comfy-nodes
pip install -r requirements.txt
Then restart. The Loader node will pull the ~1GB of model checkpoints on first run.
Common issues
- Empty text raises "Text prompt is required." - the node doesn't generate from nothing.
- Motion looks stiff or wobbly - raise
timestepsand/or lowercond_scale. Stiffness usually means you're over-guiding. - Duration seems random - that's the length estimator being a model with opinions. Set
duration_secondsif you need repeatable lengths. - Behavior shifted after an update - the pack's README literally says the author changes how nodes behave without warning. If a workflow stops reproducing, that's the first thing to suspect, and pinning the git revision is the cure.
One honest caveat: this is a thesis-model wrapper, not a tuned product. Motions are good for blocking, posing, or driving a retarget, not instantly MoCap-grade. Treat it as a fast way to get a believable first-pass skeleton and you'll be delighted.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | HYBRID_MAMOMASK_MODEL | — | |
| text | STRING | A person walks forward and turns around. | — |
| seed | INT | 420–2147483647 | — |
| duration_secondsopt | FLOAT | 0.00–9.8 | 0 uses the model's length estimator. |
| timestepsopt | INT | 181–64 | — |
| cond_scaleopt | FLOAT | 4.00.1–20 | — |
| res_cond_scaleopt | FLOAT | 5.00.1–20 | — |
| temperatureopt | FLOAT | 1.00.1–3 | — |
| topk_filter_thresopt | FLOAT | 0.900–1 | — |
| gsampleopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| motion | HYBRID_MAMOMASK_DATA | — |