ComfyUI Node

Astral Animator

A tiny Deforum for camera-move clips

By ShmuelRonen·Created 2 years ago·Updated 2 years ago· 18
Astral Animator
  • model
  • vae
  • positive
  • negative
  • image
  • IMAGE
seed0
steps20
cfg8.0
sampler_name
scheduler
frame16
x15
y0
zoom0.98
angle0
denoise_min0.40
denoise_max0.60
easing_type

Astral Animator is a single-node "camera move on a still image" tool. You feed it one picture, it hands back a short clip that zooms, pans, and rotates - like a Deforum-lite, minus the full Deforum workflow, the scheduling UI, and the patience. If you've ever wanted a cheap Ken Burns effect that keeps your checkpoint's exact look instead of dragging a video model in, this is the node.

Be clear-eyed about what it is, though: this is 2023-era per-frame img2img, not a video model. There's no temporal layer, so nothing keeps the subject locked between frames. Short clips read as smooth camera motion; long ones read as a slow morphing dream. That's not a bug, it's the approach - the same one Deforum used before AnimateDiff and Wan came along and ate the "real video" use case. For a drifting camera shot, it's still a perfectly fine, dead-simple tool.

How it works

The loop is right there in the source and it's easy to follow: each frame, it transforms the current image by your fixed x, y, zoom, and angle (using reflection padding and a torchvision affine), encodes it to a latent, samples with your KSampler settings at a denoise strength, and decodes the result to become the next frame's input. Motion accumulates frame over frame, so x: 15 means a gentle steady pan, not a single 15-pixel jump.

One thing the README gets wrong: it claims easing_type controls how the motion accelerates. It doesn't. Looking at the code, easing only shapes the denoising ramp - denoise starts near denoise_min and eases up to denoise_max across the clip. The camera move stays linear no matter what easing you pick. Don't reach for "Bounce Out" expecting a camera bounce; it shapes how aggressively the model re-draws each frame.

The inputs that matter

You wire it like a KSampler: model, vae, positive, negative, and an image as your starting frame, plus seed, steps, cfg, sampler_name, scheduler (all the standard names). The animation knobs are:

  • frame - clip length (default 16). Heads up: the output tacks your source image onto the front, so 16 frames returns a 17-image batch.
  • x / y - pixels of movement per frame. Positive x moves right, negative y moves up.
  • zoom - 1.0 is static; default 0.98 is a slow zoom out. Small values are the difference between "camera drift" and "seasickness."
  • angle - degrees of rotation per frame.
  • denoise_min / denoise_max (default 0.4–0.6) - how much the model re-draws. Below ~0.3 and nothing really moves; above ~0.7 and your subject starts melting across frames.

The single IMAGE output is a batched tensor of all frames, ready for VHS_VideoCombine - the bundled example workflow does exactly that, with a FILM VFI interpolation node in between if you want smoother playback.

Installing it

The README's clone URL is a literal your-username placeholder - the real one is:

cd ComfyUI/custom_nodes
git clone https://github.com/ShmuelRonen/ComfyUI-AstralAnimator

Then restart ComfyUI (or reload custom nodes). ComfyUI Manager also finds it as "ComfyUI-AstralAnimator." There are no model downloads and no real dependencies - the code only needs numpy, torchvision, and tqdm, all of which a stock ComfyUI already ships.

Gotchas worth knowing

  • No temporal coherence. Keep clips short and motion subtle, or faces drift. If you need actual motion coherence, you're looking for Wan, not this.
  • Default cfg is 8, which is hot for SDXL and especially Pony-class models - drop it to 6–7.
  • It's sequential, so N frames × 20 steps is N× slower than one image. Use it for short clips, not minute-long exports.
  • The extra leading frame catches people out - if your output is one image longer than frame, that's by design.
Categoryanimation

Inputs (18)

NameTypeDefaultDescription
modelMODEL
vaeVAE
positiveCONDITIONING
negativeCONDITIONING
imageIMAGE
seedINT00–18446744073709550000
stepsINT201–10000
cfgFLOAT8.00–100
sampler_nameCOMBO34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28
schedulerCOMBO9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3
frameINT16
xINT15-4096–4096
yINT0-4096–4096
zoomFLOAT0.98
angleINT0-360–360
denoise_minFLOAT0.400–1
denoise_maxFLOAT0.600–1
easing_typeCOMBO22 options: Linear, Sine In, Sine Out, Sine In/Out, Quart In, Quart Out, +16

Outputs (1)

NameTypeDescription
IMAGEIMAGE