I decided I wanted something more volumetric. The sprites generated in the above articles are based on 2D, flat "slices" of a 3D function, and in the process of slicing it, depth is lost. I attempt to fake depth by layering different sprites, starting with a large one and working down to smaller ones. Today, I tried something different.
I start with a 3D sphere function as in the previous entries, perturbed using 3 fBm noise functions. I then iterate the pixels of the image as the X and Y axes of the function, and at each step I sample a column along the Z-axis to determine the color of the pixel to output, iteratively stepping along the column until I find a point where the value of the function evaluates to greater than some specified threshold. I tried 2 different methods for calculating the color once I found this 'surface' point.
For the first method, I used the (x,y,z) coordinates themselves, normalized to a unit vector, and performed a dot-product operation with the vector (0,0,1) to generate a value which was then used to interpolate the flame color scale and generate a final color for that pixel. Here is a typical result from this operation:
It has a bit more 'bumpiness' than the previous ones, but to me it still seems sort of flat. So I tried a second method. At each surface point where the function evaluates to greater than threshold, I take the gradient of the 3D function and perform a dot product with (0,0,1) then, as before, use this value to sample a color scale. The results of this operation are very nicely bumpy:
Next up is determing a suitable method for animating the explosion in a realistic manner.