HomeArticlesGenerative Art

3D Curl Noise: Flow Fields Without Sinks or Sources

Take the curl of a Perlin noise potential and you get an incompressible velocity field for free — no solver, no pressure projection, just a vector identity.

mysimulator teamUpdated June 2026≈ 7 min read▶ Open the simulation

The problem with raw noise as a flow field

Perlin noise and its relatives (Simplex, Worley) are the standard tool for adding organic-looking randomness to computer graphics, and it's tempting to sample a 3D noise function directly and treat its gradient as a particle velocity. The result looks noisy in the right way for a texture, but as a flow field it fails badly: gradient-based fields have nonzero divergence almost everywhere, meaning some regions of space act as invisible drains that suck particles in and others act as invisible sources that push them away. Watch it run for more than a few seconds and particles visibly clump into blobs or evacuate whole regions of the screen.

live demo · particles following a divergence-free noise field● LIVE

The fix is a single vector identity

Vector calculus gives an escape hatch that requires no fluid solver at all: for any smooth vector field Ψ, the curl of that field, ∇×Ψ, is guaranteed to have zero divergence. This is an identity, ∇·(∇×Ψ) = 0, true for every possible Ψ — so if you build a velocity field by taking the curl of some potential field, incompressibility is automatic, not something you have to solve for.

Psi(x,y,z) = ( noise1(x,y,z), noise2(x,y,z), noise3(x,y,z) )   // 3 independent noise fields

v = curl(Psi) = ( dPsi_z/dy - dPsi_y/dz,
                   dPsi_x/dz - dPsi_z/dx,
                   dPsi_y/dx - dPsi_x/dy )

// approximate each partial derivative with a central difference:
dPsi_z/dy ≈ ( Psi_z(x, y+e, z) - Psi_z(x, y-e, z) ) / (2*e)

Take three independent noise fields, one per component of the potential Ψ, and compute the curl numerically with central finite differences (the standard technique, popularized in Robert Bridson's 2007 SIGGRAPH paper on curl-noise for procedural fluid flow). The output is a genuine incompressible velocity field, sampled anywhere in 3D space, at a cost of a handful of noise evaluations per point — dramatically cheaper than solving the pressure Poisson equation a real Navier-Stokes solver requires.

Why it looks like turbulence

Perlin-style noise has energy spread smoothly across a range of spatial frequencies rather than concentrated at one scale, and its curl inherits that property: you get eddies at multiple sizes nested inside each other, visually reminiscent of the cascading vortices of real turbulent flow, even though nothing here obeys the Navier-Stokes equations. Layering several octaves of noise at different frequencies (fractal Brownian motion) before taking the curl pushes the resemblance further, adding fine swirling detail on top of large slow-moving eddies — the same octave-stacking trick used to make Perlin noise itself look like natural terrain or clouds.

Where it's actually used

Curl noise is a workhorse in visual-effects production: smoke, fire, magic-spell trails and particle-based fluid dressing in film and games are frequently driven by curl noise rather than a full fluid simulation, because it's evaluable at any point at any time — no grid, no simulation history, trivially parallel across millions of particles — and it can be layered on top of a coarse real simulation to add fine sub-grid detail cheaply. The tradeoff is that it has no memory of obstacles, boundaries or momentum conservation; it's a kinematic approximation of flow, not a physical one, and it is chosen specifically because "looks incompressible" is often all a shot needs.

Frequently asked questions

Why not just use raw Perlin or Simplex noise as a velocity field?

Because a raw noise field has nonzero divergence almost everywhere, which means particles pile up in some regions and get vacuumed out of others. Curl noise fixes this by construction: the curl of any vector field is always divergence-free, so particles neither clump into sinks nor evacuate from sources.

What does taking the curl actually buy you visually?

Incompressible, swirling motion with no visible attractors or repellers — smoke, fire and fluid-like flows where particle density stays roughly uniform over time instead of collapsing into blobs, which is the giveaway of a naive gradient-based flow field.

Is curl noise an actual fluid simulation?

No — it has none of the pressure-projection or advection machinery of a real Navier-Stokes solver, and it ignores boundaries and obstacles entirely. It is a cheap kinematic approximation that looks fluid-like because it shares one crucial property with real incompressible flow: zero divergence.

Try it live

Everything above runs in your browser — open 3D Curl Noise Flow Field and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.

▶ Open 3D Curl Noise Flow Field simulation

What did you find?

Add reproduction steps (optional)