Generating animations of clouds with Mathematica

This is a 2D Gaussian random field with a $1/k^2$ spectrum and linear dispersion $\omega \propto k$. I clip the field to positive values and square root it to give an edge to the "clouds".

n = 256;
k2 = Outer[Plus, #, #] &[RotateRight[N@Range[-n, n - 1, 2]/n, n/2]^2];

spectrum = With[{d := RandomReal[NormalDistribution[], {n, n}]},
   (1/n) (d + I d)/(0.000001 + k2)]; 
spectrum[[1, 1]] *= 0;

im[p_] := Clip[Re[InverseFourier[spectrum Exp[I p]]], {0, ∞}]^0.5

p0 = p = Sqrt[k2];

Dynamic @ Image @ im[p0 += p]

enter image description here


Nice cloud-like images can be generated by summing "octaves" of any of a number of continuous noise functions. Perlin noise is one possibility, as mentioned in the OP; here, I'll present a slightly simpler noise function termed lattice convolution noise. The following implementation is adapted from Ebert et al.'s book, with a few of my own tweaks:

lcnoise = With[{perm = Mod[(112 # + 185) # + 111, 256, 1] &, 
                mncub = Compile[{{r, _Real}}, 
                                Which[0 <= r < 1, 16 + r^2 (21 r - 36),
                                      1 <= r < 2, 32 + r (-60 + (36 - 7 r) r),
                                      True, 0]/18, 
                                RuntimeAttributes -> {Listable}], n = 256, 
                vals = RandomReal[{-1, 1}, 256]},
               Compile[{{x, _Real}, {y, _Real}, {z, _Real}},
                       Module[{s = 0., fx, fy, fz, ix, iy, iz},
                              ix = Floor[x]; iy = Floor[y]; iz = Floor[z];
                              fx = x - ix + 1.; fy = y - iy + 1.; fz = z - iz + 1.;
                              Do[s += vals[[Fold[perm[Mod[#1 + #2, n, 1]] &, 0,
                                                 {iz + k, iy + j, ix + i}]]]
                                      mncub[Norm[{i - fx, j - fy, k - fz}]],
                                 {i, 0, 3}, {j, 0, 3}, {k, 0, 3}]; s], 
                       CompilationOptions -> {"InlineCompiledFunctions" -> True}, 
                       RuntimeAttributes -> {Listable}]];

To get clouds, we can do this:

clouds =
    Table[DensityPlot[Clip[Sum[lcnoise[2^k x, 2^k t, 2^k y]/2^k, {k, 0, 3}], {0, 1}],
                      {x, -5, 5}, {y, -5, 5}, 
                      ColorFunction -> (Lighter[RGBColor[0.53, 0.81, 0.92], #] &),
                      Frame -> False], {t, 0, 5, 1/4}];

ListAnimate[clouds]

clouds