Senior Thesis - "Embers" - Week 5

Welcome to Midterms Part Uno! The goal for myself for midterms was to have all of the simulations running and moving together. They are not in perfect synchronization, but this will allow me to plan better going forward into Finals Round 1.

Week 5 Renders:

Bonfire Flames:

Current Smokeless Flame DOP setup for main and fill simulations

I focused on getting more of a flowing flame look by using sharpen and turbulence. I have a large scale turbulence disabled that I will use later for the large swiping, magical motion. I will be adding more shredding to get better "licking" shapes.

Kettle Steam:


The main improvement/change that I made was in the pop sourcing. I originally not happy with the filament solver results because it "overrode" other operations, but that was fixed by applying other operation post filament advection. I also removed my pop curve force and pop axis force because those created strong velocities that didn't work well for the wispiness of the pyro sim.

I also changed the source geo to a torus to give an emission shape that followed the rim of spout better.


I generated source points from the kettle lid geometry and then applied a color noise to randomly select where the steam would actually emit from. I didn't want the steam to emit from all around the lid. The setup is similar to all the other pyro sims, its just a matter of tweaking the attribute data I am feeding in to determine the speed and scale of the simulation. I did make the burn attribute noise almost static and the temperature attribute noise have a longer pulse duration and larger element size to get the thicker leaks of smoke.

There was a bit of post-processing involved to clean up the density to sharpen it and make it look like it was leaking from between the lid and the base because making that collision happen in a pyro simulation isn't efficient.

PDG Single Flames and Smoke:

I did decide to end up using PDG for detail smoke and flame simulations because I am able to control and get higher quality "sparse" flames better than including it in a much larger overall source that requires more simulation time. Its a simple TOPS set up with wedges driving attributes in the simulations.

Flames PDG network

Smoke wedges -

  1. Source wedges:

  2. Simulation wedges: temperature "pull" acceleration strength; cooling rate

Flame wedges -

  1. Source wedges: x/z noise offset for source selection; temperature attribute pulse duration; pop force swirl size, pulse length, and offset (offset connected to wedge index)

  2. Simulation wedges: source index; flame lifespan; turbulence scale, swirl size, and seed (offset connected to wedge index)

For the flames specifically, I am running two caches: one for the source and one for the simulation. From the source cache, I have already have 8 source computations to feed into the simulation to use in wedging. How I source that is by reading a created attribute called "source index" that is also used in the file name so the correct variation can be called procedurally.

I limited additional wedging for the simulation to a count of 1 for the moment because the sources are very different and I already have 8 pyro simulations to run at one go (thank goodness for 128GB of ram). BUT I don't have to simulate all 8 sources. I could only do 4 that I like by targeting a value list for "source index" instead of a range from 0-7. Then I could wedge more pyro simulation parameters and still only have 8 simulations to run.

Embers Particulate:

Here is another great instance to use PDG for iterations. POPs are really fast and so I can run multiple instances of Houdini at the same time. Getting this particulate right is going to take many iterations, these are the first couple. Right now, there is just some simple forces being applied, but I plan to use VEX to program the behavior of the particles rather than 100% leaving it to chance.

The main thing here is that the embers are advected by the velocities of the smoke. The reason I didn't choose the velocities of the flames is because the embers will more likely interact and be visually compared with the smoke. The source is also pretty much the same for the smoke and flames.

Fixes and Things I Learned:

The first thing I learned over the past week is something my mentor taught me. It is a method for removing that dreadful porcini mushroom shape that plagues every simple pyro simulation.

Cursed Porcini Mushroom No Cursed Mushrooms

By using a Scalar Field DOP, you can attached one-dimensional data, such as a mask, to the smoke object and be manipulated by solvers or wrangles. The field is made of voxels.

The scalar field has similar parameters to the smoke object like division size and bounding size that should be matched accordingly, and then the data name that will be called later in the solvers. This method is meant to be applied before adding microsolvers to give a better jumping point into detailing. Any solvers you make or apply this field to should be applied first in the advection input of the pyro solver.

The example above uses gas field wrangle that I use to add noise to a "turbmask" (the data name); then a gas blur node to blur the values of the turbmask by specifying that in the field parameter; and then this manipulated data is set to the control field of a gas turbulence node. For full affect of the data, the control influence is set to 1.

Second thing: there are bugs with VDBs for Rfh 23.5. I had converted the resulting volumes of my fire in a pyro-post process node to VDBs to reduce the memory load and squash the vel attributes back into one vector. This caused clipping of data that only appeared at render time. VDBs are not the "cause" of the clipping artifact, but there's probably a bug when Renderman converts that to a F3D file at render time.

Third thing: a simple density manipulation to get smokeless flames when using Renderman. I talked about two weeks ago about how the shader requires a density field. I am getting density data greater than 0 where the temperature is 0. When I render with my color ramps, I have the black color when temperature * flame = 0. That density data rendered black, giving the appearance of "smoke." To fix, I multiplied the density and temperature fields in a volume vop. (Multiplying inside the shader didn't give expected results).

Final Thing: avoid stepping in POP simulations by changing the jitter birth time to "negative" and interpolate source to "back." This is avoids having to turn up the substeps or adding extra forces.

Now I will be focusing on the motion sequence of the FX and refining them, and getting better lighting for renders and starting compositing. Also doing some creative post-processing on the simulations, so off to VDB land! See you next week!