SineWave
Make your image shiver
- image
- IMAGE
If you've ever wanted your image to look like it's being rippled by wind, heat shimmer, or a bad VHS tracking - this is the node. SineWave displaces each row or column by a sine wave, so the image bends into those smooth, undulating squiggles that make a flat render feel alive. It's a small, focused effect node, and its three inputs are all there is to it. Perfect for that "flag in the breeze" or "underwater" wobble you can't get from any static filter.
How it works
For each line of the image, the node computes a displacement amplitude * sin(2π * position * frequency / dimension) and rolls that line sideways (or up and down) by the resulting offset. Each line shifts by a slightly different amount along the sine, which is what produces the smooth wave instead of a straight shear. The torch.roll means pixels that leave one edge wrap around to the other, so you get a bit of smearing at the extremes - a feature of the look, not a bug.
- amplitude (0–150, default 10) - how far the wave displaces pixels, in image pixels. This is your intensity dial: 5–15 is a subtle shimmer, 50+ is full flag-in-a-hurricane.
- frequency (0–20, default 5) - how many wave cycles fit across the image. Low frequency = one big slow bend; high frequency = a tight rippling wobble.
- direction -
horizontalbends the image along rows (the classic vertical ripple, like a curtain);verticalbends columns (a side-to-side wobble). Same idea, different axis.
Output is a single IMAGE.
Install
SineWave is one of ~22 nodes in ComfyUI-post-processing-nodes.
- ComfyUI Manager: search "post processing nodes", install, restart.
- Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/EllangoK/ComfyUI-post-processing-nodes
Restart after. No requirements.txt, no downloads - per-line torch.roll calls. It's under postprocessing → Effects in the node menu.
Actually using it
For a still image it's a one-shot novelty. Where it earns its keep is video: animate the amplitude (or phase, if you're driving it with a time-based input) across a frame sequence and you get a convincing organic shimmer. Two practical notes: the per-line loop is slow-ish on big images - a 2048px render will pause for a second or two - and the wrapped-edge smear gets obvious at high amplitude, so either keep amplitude modest or crop afterward. It's a one-trick node, but the trick is a good one, and it's the only thing in this pack that moves.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| amplitude | FLOAT | 100–150 | — |
| frequency | FLOAT | 50–20 | — |
| direction | COMBO | 2 options: horizontal, vertical |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |