Astral Animator
A tiny Deforum for camera-move clips
- model
- vae
- positive
- negative
- image
- IMAGE
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
cfgis 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.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| image | IMAGE | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.00–100 | — |
| sampler_name | COMBO | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 | |
| scheduler | COMBO | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 | |
| frame | INT | 16 | — |
| x | INT | 15-4096–4096 | — |
| y | INT | 0-4096–4096 | — |
| zoom | FLOAT | 0.98 | — |
| angle | INT | 0-360–360 | — |
| denoise_min | FLOAT | 0.400–1 | — |
| denoise_max | FLOAT | 0.600–1 | — |
| easing_type | COMBO | 22 options: Linear, Sine In, Sine Out, Sine In/Out, Quart In, Quart Out, +16 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |