Nodes/MKRShift_Nodes/Shockwave Distort
ComfyUI Node

Shockwave Distort

Shockwave Distort does the ring, the blur, and the chromatic edge in one node

By criskb·Created 7 months ago·Updated 5 months ago· 0
Shockwave Distort
  • image
  • mask
  • image
  • mask
  • shockwave_info
settings_json{"center_x":0.5,"center_y":0.5,"radius":0.22,"width":0.08,"amplitude_px":14.0,"ring_hardness":1.5,"chroma_split_px":1.2,"mix":1.0,"mask_feather":4.0,"invert_mask":false}

Every energy-blast frame needs the same thing: a radial ring pushing the pixels outward, and a little chromatic fringe at the edge so it reads as real distortion instead of a sticker. x1ShockwaveDistort is that, as a single node - a radial displacement that you place on any still, no keyframes, no external compositor. If you're doing action keyframes, explosion aftermath, or "hit" frames for a comic panel, this is the fast route.

How it works

It builds a normalized coordinate grid over your image, then pushes pixels radially outward from a center point you choose. The displacement only fires inside a ring - radius picks where the ring sits (as a fraction of the frame, 0.22 by default), width sets the band thickness, and ring_hardness (1.5) controls how soft or knife-edge the falloff is. amplitude_px is how far the pixels actually get shoved in that band; crank it and the ring visibly "slams" the image.

The second half is the chromatic split: chroma_split_px displaces the red and blue channels separately inside the ring, so the shockwave edge gets that classic RGB fringe. It's a small amount by default (1.2px) - enough to read, not enough to look like a 2008 Windows screensaver. Bump it for a harder impact.

If you set amplitude or mix to zero, the node short-circuits to a straight passthrough - useful for wiring a "shockwave on/off" toggle without rerouting the graph.

The inputs that matter

Like most MKRShift x1 finishing nodes, all the knobs live in one settings_json string (with a prefilled default when you drop the node):

  • center_x / center_y (both 0.5) - the ring's center as fractions of the frame. For a punch to the head, that's 0.5/0.5; for an explosion at the horizon, drag them.
  • radius (0.22) and width (0.08) - where the ring sits and how thick it is.
  • amplitude_px (14.0) - the actual pixel push. Negative values pull inward instead of out, which is a nice suction/implosion look.
  • ring_hardness (1.5) - soft falloff vs hard edge.
  • chroma_split_px (1.2) - the RGB fringe at the ring.
  • mix (1.0) - blend the distorted result back against the original, so you can lay a subtle pass over an already-animated frame.

The optional mask input confines the effect to a region, with mask_feather and invert_mask in the JSON. Outputs: image (the distorted frame), mask (the ring band it actually moved, handy if you want to composite the distortion against itself), and shockwave_info (a text line with the resolved settings, or the "bypassed" note).

Installing it

It's part of the MKRShift Nodes pack, so you install the whole pack. ComfyUI Manager: search "MKRShift", install, restart. Or:

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

Restart after. No model downloads - the distortion is pure torch grid math, runs on CPU fine.

Gotchas

The usual settings_json trap applies: invalid JSON falls back to defaults silently, so if the shockwave stops appearing after you edit it, check your braces. And the ring is a function of the frame fraction, not pixels - a 512px test image and a 2048px render will show the ring in different absolute sizes at the same radius value. Set it on your final resolution, not the preview size.

CategoryMKRShift Nodes/VFX/Distortion

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
settings_jsonSTRING{"center_x":0.5,"center_y":0.5,"radius":0.22,"width":0.08,"amplitude_px":14.0,"ring_hardness":1.5,"chroma_split_px":1.2,"mix":1.0,"mask_feather":4.0,"invert_mask":false}
maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
maskMASK
shockwave_infoSTRING