π Sine Camera Zoom
The Breathing Zoom That Loops Without a Visible Jump
- frames
- frames
The Linear Camera Zoom [DVB] pushes in and stops. Sine Camera Zoom [DVB] breathes - it eases in, holds, eases back out, and returns to where it started. It's the pulsing "living camera" feel you see in a lot of AI-generated ambient loops, and it's one of the few DVB camera nodes where the sine behavior is the whole point rather than a variant.
Mechanically it's the same crop-window zoom as the linear version: the window size interpolates between the full input frame and your output_width Γ output_height, then resizes to the output size. The difference is the driver - the zoom factor follows a sine wave over the clip, with a loopable adjustment in the source so the first and last frames land at the same zoom level. No direction input here, by the way. The linear zoom needs an "in or out" switch because it travels one way; the sine inherently goes in and out on its own, so that knob doesn't exist. It's a nice piece of interface design worth noting if you came here from the linear node.
The inputs that matter
frames- theFRAME_SETin.output_width/output_height(both default512) - the output size and the tight end of the zoom. Smaller than the input, always.period_seconds(default1, min0.1) - one full breathe cycle in seconds of footage, converted using the frame set's own frame rate.phase_seconds(default0) - where in the cycle the animation starts; use it to stagger a zooming layer against a panning one.
Output is a single frames - a FRAME_SET at your requested size.
Installing
It's in the Dream Video Batches pack (Alt Key Project / Dream Project), which also needs to be present for any of the sibling nodes to exist:
cd ComfyUI/custom_nodes
git clone https://github.com/alt-key-project/comfyui-dream-video-batches.git
cd comfyui-dream-video-batches
pip install -r requirements.txt
Or ComfyUI Manager β "Dream Video Batches" β install β restart. No model downloads; the pack is pure image math.
Where people get burned
The usual suspects, plus one sine-specific. Headroom: the breathing zoom needs input clearly larger than output, or the "in" phase is invisible - a 512 output from a 512 input is a static frame with extra steps. Framerate: period_seconds is interpreted against the frame set's fps, so if you built the set with the wrong rate in Create Frame Set [DVB], your one-second breathe becomes a quarter-second twitch. And the loop caveat that applies to all the sine nodes: leave phase_seconds at 0 for a clip you plan to cycle, because shifting the phase trades away the seamless loop. If the goal is a subtle push-in that never returns, you actually want the linear node, not this one - the sine always comes back.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | FRAME_SET | β | |
| output_width | INT | 512 | β |
| output_height | INT | 512 | β |
| period_seconds | FLOAT | 1.0 | β |
| phase_seconds | FLOAT | 0.00 | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| frames | FRAME_SET | β |