Viggle-Animate Conditioning (H3)
The reference-packing node behind Viggle-Animate (H3)
- cond_video
- ref_image
- text_cond
- vae
- positive
- latent
If you've seen the "make any character dance" clips Viggle made famous on the web, you know the trick: take a still of a person, drop them into a video of someone else moving, and the model re-renders the whole performer as your character while keeping every bit of the original motion, camera and lighting. That's exactly what this node is for - except it's the local, open-weights version, running on Viggle-Animate, a 33B full finetune of MiniMax-H3's ref2va video transformer. This node, Viggle-Animate Conditioning (H3), is the workhorse of the pack: it takes your driving video and reference still, encodes them, and lays out the conditioning exactly the way the finetune was trained.
It does this without a single word of prompting. No text encoder, no CLIP, no prompt box, no negative prompt - Viggle-Animate runs on one frozen 362-token text embedding computed once by the Viggle team, identical for every render. Nice side effect for beginners: there's nothing for you to get wrong with wording, and no text encoder eating VRAM.
What it actually does
Mechanically the node does three jobs. First, it encodes the driving video frames and the reference still through the MiniMax-H3 video VAE. That encode is slow - seconds at these resolutions - so it fingerprints the inputs and caches the latents, meaning repeat runs with the same clip and image skip the stall entirely. Second, it packs the two references onto a single canvas: video first, picture second, both nested at the short edge of the driving clip's resolution. That order and layout are not arbitrary - it's the exact arrangement the finetune was trained on, so you don't get to reorder them. Third, it returns the two things the sampler needs.
The inputs that matter
The full set is cond_video, ref_image, text_cond, vae, width, height, length. Most are obvious; the few you'll actually touch:
- cond_video - the driving clip as frames at 24 fps, straight out of a Load Video node (VHS). It supplies all the motion, camera, background and lighting. Resolution and frame count of the output are decided here.
- ref_image - a single still of the person you want in the video. This is where identity comes from, so make it a clean, well-lit face-forward shot. Pick who's in the video by changing this one image.
- length - frames at 24 fps. Default 124 (about 5.2 seconds), and it snaps to the model's 17k+5 temporal grid, so 124 isn't a random number. Set your Load Video
frame_load_capto match it exactly. - width / height - both default to 0, meaning "use the driving clip's own dimensions," which is the evaluated configuration. Set them only to resize the output; keep them multiples of 32, and pre-scale the clip with an image-resize-to-pixels node rather than fighting the VAE.
Where the outputs go
Two outputs: positive (a CONDITIONING that carries the packed references plus the frozen text embed) and latent (the starting latent, shaped to the target canvas and length). Both feed the sampler - typically into a SamplerCustomAdvanced flow alongside a MiniMaxH3SigmaShift node set to shift 3, the DMD2 LoRA at strength 1, and 4–8 steps at CFG 1.0. Because it's guidance-distilled, CFG 1 is correct and your negative prompt is doing nothing: the model already baked guidance in. Raise CFG and you just burn the image and double the render time.
Installing it and the models
cd ComfyUI/custom_nodes
git clone https://github.com/Saganaki22/ComfyUI-Viggle-Animate-H3
or search the pack title in ComfyUI Manager and restart. No pip dependencies - the pack leans entirely on ComfyUI's native MiniMax-H3 support, so keep ComfyUI current. The heavy part is the weights, which need specific folders:
diffusion_models/minimax_h3_ref2va_viggle_pruned_int8_convrot.safetensors(20.3 GB, the one to reach for)loras/viggle_animate_dmd_lora_r64.safetensors(0.9 GB)text_cond/fixed_embed_fwd_anyframe.safetensorsvae/minimax_h3_video_vae_int8_convrot.safetensors
A 33B model is not a 3060 afternoon. The pruned int8 build is the community's VRAM play, and it's still a serious chunk of a modern card. Two warnings belong on this page. The weights are a derivative of MiniMax H3, so the MiniMax H3 Community License applies - and it excludes the US, EU, UK and South Korea from its territory, meaning users there aren't licensed to run the local weights at all. And since identity comes from the still you feed it, don't run this on people who haven't consented. The pack's own README says the same; take it seriously.
Where people get burned
The most common failure is an empty text_cond dropdown on the companion loader - the file isn't in ComfyUI/models/text_cond/ (the pack creates that folder on import). Next: a frame_load_cap on Load Video that doesn't equal length. A clip under 5 frames throws a hard error, and past a 1:4 to 4:1 aspect ratio the node refuses rather than quietly producing garbage.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| cond_video | IMAGE | Driving video frames at 24 fps (Load Video node). Supplies motion, camera, background, lighting. | |
| ref_image | IMAGE | Single still of the person to place in the video. | |
| text_cond | TEXT_COND | From the Load Text Conditioning node. | |
| vae | VAE | MiniMax-H3 video VAE (from the base model). Encodes the driving clip and the reference still. | |
| width | INT | 00–16384 | Target width. 0 = driving clip's own width (the evaluated configuration). |
| height | INT | 00–16384 | Target height. 0 = driving clip's own height. |
| length | INT | 1245–3600 | Frames at 24 fps, snapped to the 17k+5 grid (124 = ~5.2 s). |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |