---
title: "10 distortion effects for video ads, with a tested Claude prompt for each"
description: "These bend, ripple or warp the whole picture rather than adding anything on top, so the product itself seems to swell, swirl or melt."
url: https://www.recharm.com/effects/lists/distortion-effects-for-video-ads
---

# 10 distortion effects for video ads

These bend, ripple or warp the whole picture rather than adding anything on top, so the product itself seems to swell, swirl or melt.

Bulge and pinch: The middle of the serum bottle swells out like a fishbowl until its label bows round, then sucks in to an hourglass waist before springing back to its normal shape.

## [1. Bulge and pinch](https://www.recharm.com/effects/bulge-pinch)

The middle of the serum bottle swells out like a fishbowl until its label bows round, then sucks in to an hourglass waist before springing back to its normal shape.

```
Add a bulge-and-pinch distortion to input.mp4 with Python, numpy and OpenCV, using ffmpeg to read and write the frames. Work on a round patch centered 50% across and 58% down the frame with a radius of 40% of the frame width (216 px on a 540-wide frame); nothing outside it moves. For each output pixel at offset (dx, dy) from that center and distance d, sample the input at center + (dx, dy) * (1 - s * 0.5 * max(0, 1 - d^2 / radius^2)^2) with cv2.remap (cubic), so with s = 1 the center shows 2x bigger (bulge) and with s = -1 it shows 1.5x smaller (pinch), easing to no change at the rim. Animate s with smoothstep easing between these keys: 0 at 0.8 seconds, 1 at 1.5, 1 at 2.5, -1 at 3.3, -1 at 4.3, 0 at 5.0; leave the video untouched before 0.8 and after 5.0 seconds. There's no text to draw, but if you add any, draw it with Pillow, not ffmpeg's drawtext. Keep the audio and save it as output.mp4 at 30fps, same size as the input.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/bulge-pinch)

Fisheye lens: At one second the bottle swells toward the camera to nearly twice its size while the acrylic block's straight edges bow into curves and the corners fall into shadow, and the shot stays that way.

## [2. Fisheye lens](https://www.recharm.com/effects/fisheye-lens)

At one second the bottle swells toward the camera to nearly twice its size while the acrylic block's straight edges bow into curves and the corners fall into shadow, and the shot stays that way.

```
Give input.mp4 a fisheye lens look with Python, numpy and OpenCV, using ffmpeg to read and write the frames. Leave it untouched before 1.0 seconds; from 1.0 to 1.4 seconds ease the lens in (smoothstep from 0 to full strength) and hold it at full strength to the end. Bend each frame about its center with cv2.remap: an output pixel at radius r (0 at the center, 1 at a corner, measured in pixels so the bend is round) samples the source at radius r * (1 + k*r^2) / (1 + k), with k = 0.8 times the strength, so the center is magnified 1.8x, the corners stay put and straight lines bow outward. Use cubic interpolation and reflect at the borders. Then darken the rim: multiply each pixel by 1 - 0.45 * strength * smoothstep((r - 0.6) / 0.4), so nothing inside 60% of the radius darkens and the corners end up 45% darker. There's no text to draw, but if you add any, draw it with Pillow, not ffmpeg's drawtext. Keep the size, the 30fps frame rate and the audio, and save it as output.mp4 (H.264, yuv420p).
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/fisheye-lens)

Shockwave: At one second a glowing ring bursts out from the middle of the bottle and races past the edges of the frame, bending the picture with a rainbow fringe as it passes, then the shot is clean again.

## [3. Shockwave](https://www.recharm.com/effects/shockwave)

At one second a glowing ring bursts out from the middle of the bottle and races past the edges of the frame, bending the picture with a rainbow fringe as it passes, then the shot is clean again.

```
Add a shockwave to input.mp4: at 1.0 seconds a single ring bursts out from the center of the frame (50% across, 50% down) and is gone by 2.0 seconds. Use Python with numpy and OpenCV (cv2.remap), working frame by frame at 30fps. On each of the 30 frames from 1.0 seconds, with progress p = (frame - 30) / 30 from 0 to 29/30: the ring's radius is R = 620 * (1 - (1 - p)^2) pixels (it eases out) and its strength is 1 - p. For every pixel at distance r from the center, let d = (r - R) / 34 and ring = exp(-d^2); bend the picture by sampling each pixel from 30 * (1 - p) * 2.33 * d * ring pixels closer to the center (reflect at the borders), using 1.3 times that bend for the red channel and 0.7 times it for blue so the ring has a colored fringe. Then add 70 * (1 - p) * ring to all three channels so the ring glows. Leave every frame before 1.0 seconds and from 2.0 seconds on untouched. Keep the size, frame rate and audio, and save it as output.mp4 (H.264, yuv420p).
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/shockwave)

Water ripple: Two drops land, one at the bottle's neck and one on its label, and rings of ripples roll out from each, bending the bottle and backdrop like a reflection in a pond until the picture settles still.

## [4. Water ripple](https://www.recharm.com/effects/water-ripple)

Two drops land, one at the bottle's neck and one on its label, and rings of ripples roll out from each, bending the bottle and backdrop like a reflection in a pond until the picture settles still.

```
Add a water ripple effect to input.mp4, as if drops fell on a pond reflecting the shot. Two drops land: the first at 1.0 seconds at 50% across and 42% down, the second at 2.0 seconds at 50% across and 62% down. From each, a band of concentric rings travels outward at 240 pixels per second: rings 44 pixels apart, the band about 200 pixels deep behind the leading ring with soft edges, each ring pushing pixels in and out along the radius by up to 9 pixels (a sine wave), and adding light and dark bands of up to 22 brightness levels (a cosine of the same wave) so the rings catch the light. Each drop's rings swell in over 0.15 seconds and die away over 2.8 seconds, and the point of impact itself stays calm. Before 1.0 seconds and after 4.8 seconds the frame is untouched. Use Python with numpy and OpenCV (cv2.remap) to bend each frame and ffmpeg to decode and encode (this effect has no text; any text would be drawn with Pillow, not ffmpeg's drawtext filter). Keep the size, 30fps and the audio, and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/water-ripple)

Twirl: At 1 second the bottle winds into a purple-and-cream spiral curled around its label while the acrylic block below and the backdrop above stay still, holds for a second, then unwinds back into a bottle by 4.5 seconds.

## [5. Twirl](https://www.recharm.com/effects/twirl-swirl)

At 1 second the bottle winds into a purple-and-cream spiral curled around its label while the acrylic block below and the backdrop above stay still, holds for a second, then unwinds back into a bottle by 4.5 seconds.

```
Add a twirl effect to input.mp4 with Python, OpenCV (cv2.remap) and numpy, and ffmpeg for reading and writing the video. Twirl a circle of radius 243 px (45% of the 540 px width) centered at x = 270, y = 499 (50% across, 52% down). For each output pixel at distance r and angle theta from that center, sample the input at the same distance and angle theta + A * (1 - r/243)^2 (bilinear), so the center turns by A and the turn fades to nothing at the rim; pixels outside the circle are left exactly as they are. A, in degrees, follows a smoothstep ease (s(p) = p*p*(3-2p), p clamped to 0-1): 0 before 1.0 s, rising to 720 from 1.0 to 2.5 s (A = 720*s((t-1)/1.5)), held at 720 from 2.5 to 3.5 s, falling back to 0 from 3.5 to 4.5 s (A = 720*(1 - s(t-3.5))), and 0 after 4.5 s. Leave the frames untouched whenever A is 0. Keep the size (540x960), frame rate (30fps), 6 second length and the audio, encode H.264 yuv420p, and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/twirl-swirl)

Heat haze: From 1 second the air starts to shimmer: thin wavy ripples climb up the frame, making the edges of the bottle and the acrylic block wobble most near the bottom while the top of the shot stays steady.

## [6. Heat haze](https://www.recharm.com/effects/heat-haze)

From 1 second the air starts to shimmer: thin wavy ripples climb up the frame, making the edges of the bottle and the acrylic block wobble most near the bottom while the top of the shot stays steady.

```
Add a heat haze to input.mp4. Leave the first 1.0 seconds untouched, then ease the haze in over 0.5 seconds (smoothstep, k = u²(3 − 2u) with u = (t − 1.0) / 0.5 clamped to 0-1) and keep it at full strength to the end. Build two smooth noise layers, each the frame width wide and twice the frame height tall: random values from -1 to 1 on a coarse grid with one value every 36 pixels across and every 14 pixels down, scaled up to full size with cubic interpolation (use a fixed random seed). At time t (s = t − 1.0) read layer A shifted up by 90 × s pixels and layer B shifted up by 153 × s pixels, wrapping around, so the ripples climb at two speeds. The haze weight down the frame is 0 in the top 15% and grows to 1 at the bottom edge as ((y/height − 0.15) / 0.85)^0.8. Each output pixel samples the input at x + dx, y + dy, with dx = k × 11 × weight × (0.65 × A + 0.35 × B) and dy = k × 11 × 0.3 × weight × (A − B), using bilinear sampling (OpenCV remap) and mirrored edges. Use Python with numpy and OpenCV for the pixels and ffmpeg to decode and encode, keep the size, 30fps and the audio, and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/heat-haze)

Funhouse mirror: For four seconds the bottle bulges fat in one band and pinches thin in the next, an hourglass shape that keeps rolling down the frame, then it settles back to its true shape.

## [7. Funhouse mirror](https://www.recharm.com/effects/funhouse-mirror)

For four seconds the bottle bulges fat in one band and pinches thin in the next, an hourglass shape that keeps rolling down the frame, then it settles back to its true shape.

```
Add a funhouse mirror effect to input.mp4 from 1.0 to 5.0 seconds; before 1.0 and after 5.0 seconds the video is unchanged. Strength k eases from 0 to 1 over the first 0.5 seconds and back to 0 over the last 0.5 seconds (smoothstep k = u²(3 − 2u), where u = min(t − 1, 5 − t, 0.5) / 0.5). Each row is stretched sideways around the frame's vertical center line by its own amount: output pixel (x, y) shows the input pixel at column w/2 + (x − w/2) / s on the same row, with s = 1 + 0.8 × k × (1 + sin(2π × (2 × y / h − (t − 1) / 2.5))) / 2, where w and h are the frame width and height. So there are 2 fat-and-thin waves from top to bottom, the fattest rows are 1.8x wider at full strength, the thinnest keep their width, and the bands roll down one wave every 2.5 seconds. Only columns move, never rows, and the center column stays put. Use Python with OpenCV (cv2.remap, cubic interpolation) and ffmpeg, keep the size, 30fps and the audio, and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/funhouse-mirror)

Kaleidoscope: At the 1-second mark the shot cuts to six mirrored copies of the top of the frame fanned around the center, so the bottle's dropper becomes a six-armed star that slowly turns clockwise.

## [8. Kaleidoscope](https://www.recharm.com/effects/kaleidoscope)

At the 1-second mark the shot cuts to six mirrored copies of the top of the frame fanned around the center, so the bottle's dropper becomes a six-armed star that slowly turns clockwise.

```
Turn input.mp4 into a kaleidoscope from 1.0 seconds on; before that, leave the frames untouched. Take the 60-degree wedge pointing straight up from the frame's center (from 30 degrees left of vertical to 30 degrees right, measured at the center, 270,480 in the 540x960 frame) and repeat it six times around the center, mirroring every other copy so the seams line up, with no scaling (a pixel's distance from the center stays the same). The pattern turns clockwise at 30 degrees per second, starting at 0 degrees at 1.0s, so at 1.0s and 5.0s the bottom half of the frame is an exact upside-down mirror of the top half. For each output pixel: take its angle clockwise from straight up, subtract 30 x (t - 1.0) degrees, add 30, take it modulo 120, fold anything above 60 back to (120 - angle), subtract 30, and sample the input at that angle and the same distance from the center (clamp to the frame edge). Keep the size (540x960), 30fps, the 6-second length and the audio. There's no text; if you add any, draw it with Pillow, not ffmpeg's drawtext. Use Python with numpy and ffmpeg, encode H.264 yuv420p and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/kaleidoscope)

Tunnel effect: At one second the picture curls round into a turning tunnel lined with mirrored copies of the shot, rings of it rushing toward you out of a dark center, then it unrolls back to the normal shot at five seconds.

## [9. Tunnel effect](https://www.recharm.com/effects/tunnel-effect)

At one second the picture curls round into a turning tunnel lined with mirrored copies of the shot, rings of it rushing toward you out of a dark center, then it unrolls back to the normal shot at five seconds.

```
Add a tunnel effect to input.mp4 with Python and numpy, decoding and encoding the frames with ffmpeg. Measure each pixel from the frame center: its distance r as a share of half the frame's short side (r = 1 at 270 px on a 540x960 frame) and its angle a from straight up, in turns of half a circle (a = atan2(x - w/2, h/2 - y) / pi, from -1 to 1). In the full tunnel, the pixel shows the input frame at x = fold(2 x (a + 0.16 x (t - 1))) x (width - 1) and y = fold(0.5 / r + 0.9 x (t - 1)) x (height - 1), where t is the time in seconds and fold(v) = |((v + 1) mod 2) - 1| (a 0 -> 1 -> 0 zigzag, so the picture repeats mirrored with no seams), sampled with bilinear blending. So the picture runs twice round the wall, mirrored, turns 0.08 turns per second, and stretches into the distance toward the center while you fly forward. Fade the far end into a dark (10, 6, 24): mix that color in by 1 - min(r / 0.3, 1)^1.5. Blend between normal and tunnel by moving each pixel's sample position from its own position to the tunnel position, and the fog with it, by a strength that eases (smoothstep) from 0 at 1.0s to 1 at 1.6s, stays 1 until 4.4s and eases back to 0 at 5.0s; before 1.0s and after 5.0s the frames are untouched. Keep the size, 30fps and the audio, and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/tunnel-effect)

Melting effect: From the 1 second mark the bottle and backdrop sag down the frame like hot wax, the lower half smearing into soft streaks with a few long drips running ahead, while the top of the shot barely moves.

## [10. Melting effect](https://www.recharm.com/effects/melting-effect)

From the 1 second mark the bottle and backdrop sag down the frame like hot wax, the lower half smearing into soft streaks with a few long drips running ahead, while the top of the shot barely moves.

```
Make input.mp4 melt. Leave the first 1 second untouched, then from 1 to 4 seconds (smoothstep easing) ramp up a downward displacement and keep it at full strength until the end. Each output pixel at row y, column x shows the input pixel from higher up the same column, at y minus a fall distance of 0.4 x frame height x column profile x (y / frame height)^0.6, so the top edge stays put and the bottom runs the most. The column profile is between 0 and 1: a gentle wavy sag between 0.25 and 0.45 (11 random values spread evenly across the 540-pixel width, linearly interpolated), plus 9 narrow drips (Gaussian bumps 12 to 28 pixels wide reaching 0.6 to 1.0) at random positions, taking the larger of the two, then smoothed with a 31-pixel Hann window so drips have rounded shoulders. Use a fixed random seed. Smear the fall: average 6 samples taken at 65% to 100% of the fall distance, so pixels leave streaks behind them. Rows above the top of the frame repeat the top row. The video keeps playing underneath. Use Python with numpy for the pixels and ffmpeg to decode and encode, keep the size, 30fps and the audio, and save it as output.mp4.
```

[Full guide: settings and the tested script](https://www.recharm.com/effects/melting-effect)

## More lists

- [**10 caption and text effects for video ads**](https://www.recharm.com/effects/lists/caption-and-text-effects-for-video-ads)
- [**10 video transitions for ads**](https://www.recharm.com/effects/lists/video-transitions-for-ads)
- [**10 hook effects for the first 3 seconds of an ad**](https://www.recharm.com/effects/lists/hook-effects-for-the-first-3-seconds)
- [**10 effects for product videos**](https://www.recharm.com/effects/lists/effects-for-product-videos)
- [**10 effects for talking-head ads**](https://www.recharm.com/effects/lists/effects-for-talking-head-ads)
- [**10 retro film looks for video ads**](https://www.recharm.com/effects/lists/retro-film-looks-for-video-ads)
- [**10 VHS and 80s retro effects for video ads**](https://www.recharm.com/effects/lists/vhs-and-80s-retro-effects-for-video-ads)
- [**10 color grades for product videos**](https://www.recharm.com/effects/lists/color-grades-for-product-videos)
- [**10 glitch effects for video ads**](https://www.recharm.com/effects/lists/glitch-effects-for-video-ads)
- [**10 light overlays for product videos**](https://www.recharm.com/effects/lists/light-overlays-for-product-videos)
- [**10 text title styles for video ads**](https://www.recharm.com/effects/lists/text-title-styles-for-video-ads)
- [**10 3D text effects for video ads**](https://www.recharm.com/effects/lists/3d-text-effects-for-video-ads)
- [**10 beat-synced edits for Reels and TikTok**](https://www.recharm.com/effects/lists/beat-synced-edits-for-reels-and-tiktok)
- [**10 audio visualizers for music and podcast videos**](https://www.recharm.com/effects/lists/audio-visualizers-for-music-and-podcast-videos)
- [**10 UGC and social proof overlays for video ads**](https://www.recharm.com/effects/lists/ugc-and-social-proof-overlays-for-video-ads)
- [**10 effects for testimonial and review ads**](https://www.recharm.com/effects/lists/effects-for-testimonial-and-review-ads)
- [**10 motion and camera effects for product videos**](https://www.recharm.com/effects/lists/motion-and-camera-effects-for-product-videos)
- [**10 stylized art looks for video ads**](https://www.recharm.com/effects/lists/stylized-art-looks-for-video-ads)
- [**10 layout and reframing effects for social video**](https://www.recharm.com/effects/lists/layout-and-reframing-effects-for-social-video)
- [**10 transitions for product reveals**](https://www.recharm.com/effects/lists/transitions-for-product-reveals)
- [**10 effects for sale and Black Friday ads**](https://www.recharm.com/effects/lists/effects-for-sale-and-black-friday-ads)
- [**10 TikTok-style effects for video ads**](https://www.recharm.com/effects/lists/tiktok-style-effects-for-video-ads)
- [**10 effects for app and SaaS ads**](https://www.recharm.com/effects/lists/effects-for-app-and-saas-ads)
- [**10 effects for skincare and beauty ads**](https://www.recharm.com/effects/lists/effects-for-skincare-and-beauty-ads)
- [**10 effects that stop the scroll**](https://www.recharm.com/effects/lists/effects-that-stop-the-scroll)
- [**10 effects for holiday ads**](https://www.recharm.com/effects/lists/effects-for-holiday-ads)
- [**10 animated chart and stat effects for video ads**](https://www.recharm.com/effects/lists/animated-chart-and-stat-effects-for-video-ads)
- [**10 caption styles for social video**](https://www.recharm.com/effects/lists/caption-styles-for-social-video)

## Find 3x _winning ads_

Recharm cuts your ad footage into tagged, searchable clips: hooks, testimonials, product shots. Find the shots that win, add the effect with Claude, and ship 3x more ad edits.

[Start 14-day free trial](https://www.recharm.com/get-started)
