🏃 SF Action Animator
Turn a composed still into a latent batch for AnimateDiff-style video — without filling VRAM with N frames
- vae
- composed_image
- fusion_mask
- video_latents
The Action Animator is the pack's bridge from still image to video, and it's honest about being a bridge: it doesn't render a single video frame itself. It takes your composed scene, encodes one frame into latent space, wraps it up with a motion mask and a frame count, and hands the whole thing to a video sampler that knows how to expand it. Think of it as the "prepare for animation" node, not the animation node.
The mechanics are the smart part. Rather than encoding all 24 frames (which would eat VRAM before the sampler even starts), it encodes once, then packs a noise_mask - the fusion mask from Scene Composer, resized to latent resolution and multiplied by motion_freedom - repeated across the frame count, plus a frame_count metadata field. Compatible samplers (AnimateDiff-style ones) read that metadata and do the expansion themselves, keeping the memory footprint at roughly one frame's worth of latent until sampling actually begins. That's a genuinely considered design for video-on-a-budget.
The inputs that matter:
- vae - needed to encode the composed image into latent space. Wire it from your checkpoint loader.
- composed_image - the IMAGE from Scene Composer's
composed_imageoutput. This is your static master. - fusion_mask - the MASK from Scene Composer. It defines where motion is allowed. If you connect a solid full-white mask, everything moves; a character-only silhouette means only the character area gets animated.
- frame_count - 8 to 120, stepping by 8, default 24. More frames = longer clip, and more for the video sampler to chew.
- motion_freedom - 0.1 to 1.0. This is the "how much of that mask actually gets to move" dial. Lower values freeze the masked region harder; 1.0 lets the mask define the full motion region.
The output: one video_latents (LATENT) - the base latent plus its noise_mask and frame_count. That feeds a video sampler (e.g., an AnimateDiff-Evolved setup), not a plain KSampler.
Install
Part of StudioFury: ComfyUI Manager → ComfyUI-Studio-Fury → Install → restart, or:
cd ComfyUI/custom_nodes/
git clone https://github.com/FuryNocturn/ComfyUI-Studio-Fury
Dependencies are torch/Pillow/numpy/aiohttp - nothing extra. Note that the pack itself doesn't ship an AnimateDiff or video-sampler; that's a separate install (ComfyUI-AnimateDiff-Evolved if you're on that stack).
Gotchas
Set expectations honestly. The KB's verdict as of mid-2026 is that AnimateDiff - the ecosystem this latent format grew up in - is largely superseded by Wan-family models, and the Action Animator's output format is very AnimateDiff-shaped. If your video sampler doesn't read noise_mask/frame_count metadata, this node's output will be an unexpandable single latent and you'll wonder what went wrong. And motion_freedom is a strength multiplier on the mask, not a magic "how much the character moves" slider - movement still depends entirely on the motion module you feed it downstream. Treat it as the well-built connector it is: it makes the composed image video-ready without doubling your VRAM bill, and it leaves the actual filmmaking to the sampler you already know how to use.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| vae | VAE | — | |
| composed_image | IMAGE | — | |
| fusion_mask | MASK | — | |
| frame_count | INT | 248–120 | — |
| motion_freedom | FLOAT | 1.00.1–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_latents | LATENT | — |