Home · Lab · FX Elements: fire, smoke, explosions

FE4 Heat distortion

Heat shimmers in place, above the fire, and very gently

FX Elements: fire, smoke, explosions · ~6 min · Free

1 The idea

Hot air bends light, so the background behind a fire shimmers. In comp we push the plate’s pixels around with an IDistort map: each value says how far to shift, and its sign says which way.

At the start the whole frame slides one way and wobbles too hard. Switch the noise map to “centred on 0” and watch the drift readout, pick “above the flame” and watch the beside/below readout, then bring the UV scale down. Tick “Show the displacement map” to see the map (red = colour taken from the right, so the picture moves left; blue = the reverse).

IDistort: out(x, y) = in(x + s·u, y + s·v), u, v centred on 0

2 Hands-on

Task: make the heat haze believable: no drift, only above the flame, and subtle (UV scale 0.5–2 px, our teaching range).

Fix the drift readout and the beside/below readout first, then watch it play (it runs from the start) and judge the UV scale by eye: it should feel like heat, not water.

SkyVFX Lab · FE4interactive · 1001

3 Deep dive

Why a 0 … 1 map slides the whole frame

IDistort reads map values as pixel offsets to look up: a value of 1 in red makes a pixel take its colour from 1 px to its right, so the picture shifts 1 px to the left. If the map holds only positive values, every pixel is pushed the same way, and the map’s average turns into a drift of the whole picture.

The fix is a map with both signs around 0: turn off the black clamp in the Grade and shift the values down by half their range. Pushes left and right then cancel on average, and only the shimmer in place is left.

MapAverage shiftWhat you see
0 … 1 noiseNot 0, one directionThe whole plate slides and wobbles
Centred noise (−0.5 … 0.5)About 0Shimmer in place, everywhere
Centred and masked above the fire0 outside the maskShimmer only in the hot air

Heat only rises

Hot air rises from the source, so the distortion lives in a column above the flame: strongly directional, strongest near the fire and fading upward, with nothing beside or below. Here the mask is a column drawn by formula over the flame: it fades in just above the tip and out higher up. In Nuke a Roto feathered toward the top, or the flame alpha blurred and pushed up, does the same job.

Once the map is centred, multiplying it by the mask makes it 0 outside, which means no shift at all. With a 0 … 1 map, masking doesn’t help: inside the mask the picture still slides one way.

If the ground under the fire or the rocks beside it wobble, the mask is wrong.

Less is more, and fast

The look of heat is a very small shift with a little softness, not big waves. A strong wobble reads as a water filter rather than hot air. In this figure about 0.5–2 px at 640×360 is our teaching range, not a rule; the right value depends on resolution, distance and how hot the fire is.

Real heat shimmer changes very quickly, visibly from one frame to the next. Slow noise looks like drifting jelly, so animate the noise upward quickly.

  1. 1Fast, stretched Noise
  2. 2Grade to centre on 0
  3. 3Mask above the fire
  4. 4Copy into u/v
  5. 5IDistort, low scale
  6. 6A little Blur

Where it sits in the comp

Heat bends the background behind the hot air, so it goes below the smoke and below the glows. Distorting after a glow gives dark rings around the light.

The same rule holds for muzzle heat: keep the offset at 0 so the frame doesn’t shift.

  1. 1Plate
  2. 2Heat distortion
  3. 3Smoke
  4. 4Glows

4 In real work

In Nuke

  1. Noise: stretch it vertically into small streaks and animate it moving up very fast.
  2. Grade: turn off black clamp and shift the values down (offset or blackpoint) until the map is centred on 0.
  3. A Roto feathered toward the top, or the fire alpha via Shuffle + Blur, multiplies the map so it is 0 outside the hot air.
  4. Copy: map red/green into forward.u / forward.v (or backward) to match the IDistort UV channels, and remove the extra channels afterwards.
  5. IDistort: UV scale is the strength; keep it low, then add a small Blur masked by the same mask.
  6. Apply all of this to the background, below the smoke and the glows.

Common mistakes → the fix

  • ✗ Leaving the noise at 0 … 1, so the whole plate slides✓ Turn off black clamp and shift the values to centre on 0.
  • ✗ Heat beside or under the flame✓ Mask it to a column above the source, fading upward.
  • ✗ Displacement so big it looks like a water filter✓ Lower the UV scale until it’s felt more than seen, and add a touch of softness.
  • ✗ Slow-moving noise✓ Animate it much faster; real heat changes shape from frame to frame.
  • ✗ Distorting after the glow, giving dark rings✓ Move the distortion below the glows and the smoke.

Before you send the shot

  • No whole-frame drift; the frame edges don’t move.
  • Heat only above the fire; the ground and nearby rocks stay still.
  • On playback it reads as heat, not water.
  • The noise shimmers fast, not slow like jelly.
  • The distortion is below the smoke and glows, with no dark rings.
  • The extra u/v channels have been removed.

5 Check yourself

One question to check yourself

You feed a 0 … 1 noise straight into IDistort. What happens?

What you learned

🔒 Answer the question above and this card opens

More questions

1. Where should heat from the campfire distort the picture?

2. After adding heat distortion, dark rings appear around the fire’s light. What is the likely cause?

Where the numbers come from: The heat map is procedural value noise made in your browser; the displacement is a teaching version of IDistort (bilinear lookup, one map for x and one for y). The “above the flame” mask is a column drawn by formula over the flame tip. The 0.5–2 px range at 640×360 is our teaching range for this figure, not a rule. Every element is our own: Mantaflow sims in Blender 5.2, rendered in Cycles through the plate’s camera (EmberGen could not export headless on this machine). No stock elements.