Graphics Reference
In-Depth Information
9.3
Procedural Turbulence
Ultimately, there is a practical limit to the resolution a fluid simulator can
run at. For an
n
n
grid, we obviously require
O
(
n
3
) memory—and the
hidden constant is a bit hefty, as you can see when you add up all the addi-
tional arrays needed for time integration, pressure solves, etc. Furthermore,
if we keep Δ
t
proportional to Δ
x
as recommended, and use the MICCG(0)
linear solver developed in Chapter 4 which requires
O
(
√
n
) iterations to
converge, we end up with the total cost of a simulation scaling like
O
(
n
4
.
5
).
That puts a pretty severe bottleneck on going to higher resolution.
However, real turbulence can show features—vortices—on a huge range
of length scales. As a point of reference, for example, turbulence in the
atmosphere can span from kilometers down to millimeters. There simply is
no practical way to directly simulate with a grid capable of capturing that
range (
n
×
n
×
10
5
). However, the turbulent features below a certain length
scale tend to lose structure and become isotropic and easily described sta-
tistically: if you filter out the large-scale motion of the fluid and zoom in
on just the small-scale turbulence, any region looks pretty much like any
other region. This is our saving grace. Below the scale of the actual simu-
lation, we can add in procedural models of turbulent velocity fields to fake
additional detail. For turbulent smoke, instead of tracking the grid-level
smoke concentration field, we instead trace and render millions of marker
particles running through this enhanced velocity field (see Rasmussen et
al. [Rasmussen et al. 03], for example).
We now take a look at two approaches to generating the required pro-
cedural velocity fields. The critical requirements are allowing control over
the spectrum of the velocity (i.e., looking at the velocity variation over
different length-scales) and making sure the velocity is still divergence-free.
∼
9.3.1
Fourier Synthesis
One of the simpler methods for generating plausible turbulent velocity fields
is to do it in Fourier space. If we take the Fourier transform of a velocity
field
u
(
x
), which we'll assume is periodic over a cube of side length
L
,we
can write it as
∞
u
ijk
e
√
−
12
π
(
ix
+
jy
+
kz
)
/L
.
u
(
x
)=
i,j,k
=
−∞
Here we're using
√
−
1 as a symbol to denote an imaginary number, instead
of the more common
i
or
j
since this topic uses
i
and
j
as indices. This
Fourier series is also obviously using complex exponentials instead of sines