Nodes/ComfyUI/WanSCAILToVideo
ComfyUI Node Runs on cloud

WanSCAILToVideo

Motion transfer without the stick figure

By Comfy-Org·Created 4 years ago·Updated 20 days ago· 121,575
WanSCAILToVideo
  • positive
  • negative
  • vae
  • pose_video
  • pose_video_mask
  • reference_image
  • reference_image_mask
  • clip_vision_output
  • previous_frames
  • positive
  • negative
  • latent
  • video_frame_offset
width512
height896
length81
batch_size1
pose_strength1.00
pose_start0.00
pose_end1.00
video_frame_offset0
previous_frame_count5
replacement_modefalse

SCAIL-2 is the motion-transfer model that ditched the skeleton, and WanSCAILToVideo is how you drive it in ComfyUI. The whole pitch in one sentence, from the workflow author: older motion transfer (Wan Animate, SCAIL-1) squeezed a driving video down to a stick figure first, and "the things that get lost in that conversion, like depth and contact, are exactly the things that matter." SCAIL-2 skips the pose skeleton entirely - you feed it a reference image, a driving video, and colored per-identity masks, and it transfers the motion directly.

That's why it does things stick-figure pipelines couldn't: multiple characters moving together, non-human subjects, even cross-identity replacement where you swap who's doing the moving. It shipped straight into ComfyUI core via Kijai's PR - no custom node pack, which was rare enough that the announcement thread's top comment was basically "this deserves a better announcement."

How it works

The node builds the conditioning stack for a SCAIL-2 generation: it encodes the pose video into a latent (downscaled to half resolution), attaches the reference image's CLIP vision features, and writes the whole thing plus an empty latent for sampling.

The inputs that matter, in rough order of "will you actually set this":

  • reference_image - the subject. First image is the primary identity; extra batch images become additional views.
  • pose_video - the driving video.
  • pose_video_mask / reference_image_mask - SCAIL-2's colored per-identity SAM3 masks. This is the input people fumble: each identity needs its own consistent color across both masks, and you generate them with the SCAIL-2 Colored Mask node (which renders SAM3 tracks into exactly this format).
  • replacement_mode - false = Animation Mode (black mask background), true = Replacement Mode (white background). Wrong mode, wrong result.
  • pose_strength / pose_start / pose_end - how hard and over which sampling steps the pose conditioning applies.
  • video_frame_offset / previous_frames / previous_frame_count - the chunking plumbing. Native context is 81 frames; longer videos are generated in chunks and stitched, and these three fields chain chunks together.

Outputs: positive/negative, latent for the sampler, and video_frame_offset to wire into the next chunk.

Where people get burned

  • The masks. SCAIL-2 quality lives or dies on the colored masks being right - correct colors, correct black/white background per mode. Get this wrong and the model either ignores an identity or merges two.
  • Chunking confusion. It's trained at 81-frame chunks with a 76-frame step, and previous_frame_count defaults to 5 anchored tail frames. Follow the offsets from chunk to chunk and identity drift mostly disappears; skip the plumbing and you get it anyway.
  • Identity drift is real across long takes. The honest community answer when someone wanted to fix it with a character LoRA: a LoRA defeats the point - if you want that much control, use VACE or Animate instead.
  • Check the anatomy. SCAIL-2 showcase threads are famous for +hundreds scores and top comments about terrifying proportions. It's flexible, not flawless.

Ships with ComfyUI core, marked experimental, and needs SCAIL-2 model files (the Comfy-Org/SCAIL-2 scaled/MXFP8 weights are the sane download, not the 65GB raw repo).

Categorymodel/conditioning/wan/scail

Inputs (19)

NameTypeDefaultDescription
positiveCONDITIONING
negativeCONDITIONING
vaeVAE
widthINT51232–16384
heightINT89632–16384
lengthINT811–16384
batch_sizeINT11–4096
pose_strengthFLOAT1.000–10Strength of the pose latent.
pose_startFLOAT0.000–1Start step of the pose conditioning.
pose_endFLOAT1.000–1End step of the pose conditioning.
video_frame_offsetINT00–16384Cumulative output frame this chunk begins at. Wire from the previous chunk's video_frame_offset output.
previous_frame_countINT51–16384Tail frames of previous_frames to anchor. SCAIL-2 trained at 5 (81-frame chunks, 76-frame step).
pose_videooptIMAGEVideo used for pose conditioning. Will be downscaled to half the resolution of the main video.
pose_video_maskoptIMAGESCAIL-2 only. Colored per-identity SAM3 mask video at the same resolution as pose_video.
replacement_modeoptBOOLEANfalseSCAIL-2 only. False = Animation Mode (pose_video_mask should have black background). True = Replacement Mode (pose_video_mask should have white background).
reference_imageoptIMAGEReference image. The first image is the primary reference (composite all identities onto it). SCAIL-2: extra batch images are used as additional views (back view, close-up, occluded background), each needing a matching reference_image_mask in that identity's color.
reference_image_maskoptIMAGESCAIL-2 only. Colored reference mask, batch matching reference_image (first = primary reference mask, rest = identity masks for the additional reference_image).
clip_vision_outputoptCLIP_VISION_OUTPUTCLIP vision features for conditioning. Model is trained with stretch resize to aspect ratio.
previous_framesoptIMAGESCAIL-2 only. Full decoded output of the previous chunk. Only the last previous_frame_count are used as the extension anchor.

Outputs (4)

NameTypeDescription
positiveCONDITIONING
negativeCONDITIONING
latentLATENTEmpty latent of the generation size.
video_frame_offsetINTAdjusted offset + length. Wire into the next chunk.