Water
Ripples on demand, and it's a real wave sim — not a canned filter
- video
- video
Water is ComfyTV's "make the surface move" stage: it drops animated ripples onto your clip, driven by rain droplets and an optional swirl, with a few physics presets to change how the waves behave. It's in the ComfyTV/VideoFX group, and it's the effect you reach for when a shot is almost right but the water in it sits there like glass - a static lake, a too-calm puddle, a drone shot over a bay that reads as a photo.
One honest disclaimer up front: this is a displacement effect, not a fluid simulation. Nobody is solving Navier–Stokes here. But for "add believable ripple to a water surface" it looks far better than the shimmer filters you'll find elsewhere, because the wave motion actually propagates.
How it works
The core is a classic 2D wave simulation. Each frame, a heightfield is updated with the damped wave equation - every pixel looks at its neighbors, and the result feeds back into the next frame's displacement. Rain drops are small Gaussian "blob" disturbances dropped at seeded, frame-spaced positions (every rain_every frames), and the whole thing displaces the image with a bilinear sample. It runs through ComfyTV's torch FX engine, so it previews live in the node and can be stacked into an FX Chain to render in a single pass with your other effects.
The physics combo is where it gets fun - and the names are a trap. The four presets (water, jelly, sludge, super_sludge) map to a damping factor of 1 − 2⁻ᵈᵉⁿˢⁱᵗʸ, and higher density means less damping, not more. So jelly (density 3, damp 0.875) settles back to a calm surface fastest, water sits in the middle, and sludge / super_sludge (damp 0.984 / 0.996) keep almost all their energy and slosh around for a long time. Same rain, four very different materials.
The inputs that matter
- physics - water / jelly / sludge / super_sludge. Start with
water. - rain (on by default) and rain_every - whether droplets fall, and how many frames apart.
4= a steady patter; crank it toward24and you barely get any. - amplitude - 0 to 1, default 0.5. Internally that 0–1 range scales to a displacement height of up to ~600px, so the difference between 0.1 and 1.0 is enormous. For subtle realism stay well under 0.3.
- swirl, swirl_x, swirl_y - a traveling disturbance instead of (or alongside) the rain. The x/y offsets nudge where the swirl centers, ±0.5 of the frame.
- seed - picks where the drops land.
The video input takes a COMFYTV_VIDEO from any upstream video stage; the single video output carries the rippled clip onward. (And if you switch off both rain and swirl, the stage just passes your clip through unchanged - a handy mute, technically.)
Install and gotchas
Same story as every ComfyTV node: install the pack via ComfyUI Manager (search "ComfyTV") or git clone https://github.com/jtydhr88/ComfyTV into ComfyUI/custom_nodes/, then fully restart. No Python dependencies beyond what ComfyUI already ships, no models to download.
The one error you'll actually hit: "This FX stage needs an upstream video" - wire a video stage into the input or it has nothing to ripple. After that, 90% of "it doesn't look like anything" complaints are just amplitude too low or rain_every too high. It's a toy you'll play with for an afternoon, but the subtle settings earn it a permanent spot in the "fix the lake" workflow.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| physics | COMBO | water | 4 options: water, jelly, sludge, super_sludge |
| rain | BOOLEAN | true | — |
| swirl | BOOLEAN | false | — |
| rain_every | INT | 41–24 | — |
| amplitude | FLOAT | 0.500–1 | — |
| swirl_x | FLOAT | 0.00-0.5–0.5 | — |
| swirl_y | FLOAT | 0.00-0.5–0.5 | — |
| seed | INT | 70–99999 | — |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |