Shockwave Distort
Shockwave Distort does the ring, the blur, and the chromatic edge in one node
- image
- mask
- image
- mask
- shockwave_info
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) andwidth(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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"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} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| shockwave_info | STRING | — |