Image Smoke Simulation
Make an Image Dissolve Into Smoke, Without Leaving ComfyUI
- image
- mask
- image
- density_preview
- velocity_preview
Image Smoke Simulation runs a buoyancy-driven fluid simulation inside ComfyUI and uses your input image as the smoke itself. No diffusion model involved, no VAE round-trip, no API key. You feed it a photo and it comes out the other end smeared and drifting like it's being carried on a thermal column. It's the closest thing in this pack to a party trick, and also a genuinely useful way to get organic motion into a still image before you send it to an img2img pass or a video model.
The mechanism is the same stable-fluids recipe the rest of the pack's simulation nodes use: it keeps a velocity field, injects random forces ("sticks") each step, applies vorticity confinement so the flow curls into billowing shapes instead of going straight, and then semi-Lagrangian advects the color field through that velocity. On top of the plain advection, smoke mode adds buoyancy (a force scaled by temperature), an ambient updraft, and a density field that dissipates over time. The image's own luminance becomes that density in the default image source mode, which is why bright areas look like they're burning off first.
There are a lot of sliders here - this is the most intimidating node in the pack - but you can ignore most of them on a first pass. The ones that shape the result:
smoke_source_mode-imagederives density from your input,randominjects puffs,maskinjects from aMASKinput. Start withimage; switch tomaskwhen you want smoke to rise from one specific region.steps- how many simulation steps run. More steps = more drift. Note that whenoutput_modeisbatch, this doubles as the batch size and you get every intermediate frame as an output image, which is a neat way to generate a flipbook for a video node.buoyancyandvorticity- upward force and curl detail. Bump vorticity to get wispy, billowing smoke instead of a straight smear.density_fade- how fast the smoke dissipates. Higher = lighter, more ephemeral look.temperature_strength- hotter smoke rises faster. Zero by default, so the sim is purely mechanical until you turn it on.resolution_scale- internal sim resolution. Drop it to 0.25–0.5 for speed; the smoke still looks fine, just chunkier.
The node returns three IMAGE outputs: the simulated image itself, plus density_preview and velocity_preview so you can see what the sim thinks it's doing. The previews are debug aids, but they're handy when you're dialing in the force settings.
Installing
This ships in the Skoogeer-Noise pack from ttulttul. Install it once and you get every node in the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
Restart ComfyUI, or find "Skoogeer-Noise" in ComfyUI Manager and let it do the same thing. Dependencies are just torch, numpy>=1.26, einops, and pyyaml - ComfyUI almost certainly has all of them already, and there are zero model files to download. The whole simulation is plain torch math running on your existing setup.
Gotchas
The sim runs on CPU tensors at resolution_scale resolution, so a big image at full scale with 200 steps will crawl. That's what resolution_scale is for. If your smoke just sits there, check density_fade (too high and it vanishes) and buoyancy (too low and there's no reason for it to move). And remember the folder needs to stay named Skoogeer-Noise - the pack's module path is custom_nodes.Skoogeer-Noise, so renaming the directory to avoid the dash is a one-way ticket to "module not found" errors. If you're on Flux.2-style models, none of this applies - this is a pure image-space node, which is exactly why it's the friendlier sibling of LatentSmokeSimulation.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image to simulate as smoke density/color. | |
| steps | INT | 300–256 | Number of simulation steps (or batch size when output_mode='batch'). |
| output_mode | COMBO | final | When 'batch', returns a batch of intermediate outputs after each step (1..steps). |
| dt | FLOAT | 1.000–4 | Time step size used during advection. |
| resolution_scale | FLOAT | 0.500.25–1 | Internal simulation resolution scale (lower = faster). |
| force_count | INT | 30–64 | Number of random force injections ('sticks') per step. When smoke_source_mode='random', also controls puff count. |
| force_strength | FLOAT | 5.00–256 | Linear force magnitude added to velocity (pixels / step). |
| force_radius | FLOAT | 0.100–1 | Normalized radius of influence for stick forces (0.1 = 10% of min(width,height)). |
| swirl_strength | FLOAT | 2.00–256 | Rotational component added around each stick position. |
| velocity_damping | FLOAT | 0.9800–1 | Velocity decay applied each step (lower = more viscous / quickly settles). |
| diffusion | FLOAT | 0.000–1 | Optional velocity diffusion (Gaussian smoothing). |
| vorticity | FLOAT | 0.300–10 | Vorticity confinement strength (adds billowing/swirl detail). |
| buoyancy | FLOAT | 1.500–10 | Strength of upward buoyant force. |
| ambient_updraft | FLOAT | 0.100–10 | Constant upward airflow added each step. |
| density_fade | FLOAT | 0.0100–1 | Density dissipation per step (higher = smoke dissipates faster). |
| temperature_strength | FLOAT | 0.000–10 | Initial temperature injection per step (hotter smoke rises more). |
| cooling_rate | FLOAT | 0.050–1 | Temperature decay per step. |
| smoke_source_strength | FLOAT | 1.000–10 | Amount of smoke density injected each step. |
| smoke_source_radius | FLOAT | 0.100–1 | Radius of smoke injection (normalized). Used as puff radius in random mode; softens the source in image/mask modes. |
| smoke_source_mode | COMBO | image | Smoke source mode: 'image' derives density from the input image; 'random' injects random puffs; 'mask' injects from a MASK input. |
| seed | INT | 00–18446744073709550000 | Seed controlling random forces and random sources. |
| wrap_mode | COMBO | clamp | How advection samples outside the bounds. |
| maskopt | MASK | Used when smoke_source_mode='mask' to define the emission region (resized to image resolution). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| density_preview | IMAGE | — |
| velocity_preview | IMAGE | — |