Nodes/MKRShift_Nodes/Ripple Warp
ComfyUI Node

Ripple Warp

The radial distortion node that's easy to overdo and hard to resist

By criskb·Created 7 months ago·Updated 5 months ago· 0
Ripple Warp
  • image
  • mask
  • image
  • mask
  • ripple_info
settings_json{"amplitude":28.0,"frequency":6.0,"phase":0.0,"twist":0.35,"center_x":0.5,"center_y":0.5,"falloff":0.45,"mix":1.0,"mask_feather":12.0,"invert_mask":false}

x1RippleWarp sends a ripple distortion through your image - concentric waves that radiate from a point and bend the pixels as they travel. It's the classic "water hit by a stone" warp, and in a still image it reads as motion, heat, or intentional weirdness depending on how hard you push it. It's from MKRShift Nodes' VFX/Play branch, the pack's effects playground, and like its sibling x1PrismEcho, it compresses what would be a multi-node shift-and-blend chain into one settings string.

Honest positioning: this is a play node. You're not going to use it on every render, but when you need a ripple - a shockwave frame, a heat-haze accent, a logo that wants to feel alive - it's the fastest path.

How it works

The warp is a radial displacement: each pixel is displaced based on its distance from a center, modulated by a sine wave in frequency, scaled by amplitude, and offset by phase. The controls:

  • amplitude (28) - how far pixels get pushed. This is your "how strong is the earthquake"
  • frequency (6) - how many ripple rings fit across the image
  • phase (0) - animates the ripple. Wire this to a timer or step it between frames and you get real motion
  • twist (0.35) - adds a rotational swirl to the displacement, so the waves spiral as they radiate
  • center_x / center_y (0.5) - where the ripple originates. Off-center = a ripple coming from a specific point on screen
  • falloff (0.45) - how quickly the effect dies with distance from center, so the edges of your frame stay calm
  • mix (1.0) - wet-dry blend with the original

All in a settings_json string, per the pack's house style.

Inputs and outputs

Required: image and settings_json. Optional: mask to restrict the warp to part of the frame - ripple the background but keep the subject steady, which is how you get the "shockwave behind a still hero" look.

  • image - the warped result
  • mask - the effective influence mask
  • ripple_info - summary string of resolved settings

Where it fits

Three honest use cases. First, shockwave/impact frames - a still that wants to feel like a moment caught mid-blast. Second, animated ripples: phase stepping is the entire effect in motion, and it pairs with the pack's frame-sequence nodes if you're doing video frames. Third, subtle surface break-up - a small amplitude with mix pulled to 0.3 adds organic movement to an otherwise flat render.

It's a sibling of x1PrismEcho in the same branch, and they stack well: ripple for the displacement, prism echo for the chromatic trail, and you've got a poster that looks like it cost more than it did.

Installing it

ComfyUI Manager (search "MKRShift Nodes") or:

cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes

Restart, no requirements, no model downloads, no ffmpeg. Like all the VFX/Play nodes, this is a "you're already using the pack" tool, not a reason to install it - but it's a nice freebie once you're in.

Where people get burned

Amplitude. The default 28 is a deliberate ripple; people immediately crank it to 100, and the image turns to liquid spaghetti that's impossible to read. If you want it loud, raise mix instead - that keeps the structure and just adds more warped frame. And at high resolutions, remember amplitude is in pixels, so the same number reads weaker on a 4K frame than a 512px one. Scale it up if your ripples look anemic.

CategoryMKRShift Nodes/VFX/Play

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"amplitude":28.0,"frequency":6.0,"phase":0.0,"twist":0.35,"center_x":0.5,"center_y":0.5,"falloff":0.45,"mix":1.0,"mask_feather":12.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
ripple_infoSTRING