ComfyUI Node

Water

Ripples on demand, and it's a real wave sim — not a canned filter

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Water
  • video
  • video
force_run_token0
project_id
parent_output_id0
physicswater
raintrue
swirlfalse
rain_every4
amplitude0.50
swirl_x0.00
swirl_y0.00
seed7

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 toward 24 and 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.

CategoryComfyTV/VideoFX

Inputs (12)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
physicsCOMBOwater4 options: water, jelly, sludge, super_sludge
rainBOOLEANtrue
swirlBOOLEANfalse
rain_everyINT41–24
amplitudeFLOAT0.500–1
swirl_xFLOAT0.00-0.5–0.5
swirl_yFLOAT0.00-0.5–0.5
seedINT70–99999
videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
videoCOMFYTV_VIDEO