Senior Thesis - "Embers" - Week 4

Updated: Feb 3

Hi everyone, welcome to post 4 of 20!

Last week was a bit light on getting work done. I did work on the Renderman volume shading a bit and getting the density to render properly for the steam, and I started setting up more sims.

Goal for week 4: catch up... more specifically -

- Get timing and collisions of main fire sim and fill fire sim correct

- Get timing and large motion of the kettle spout steam correct

- Start exploring density post processing for kettle steam sims

- Evolve fire shader to be working

Next week I'll look to have particulate so that way I have most of the effects rendering for midterms. I may also get some more textures installed and adjusted to also be rendered.


Fire Simulations-

Flipbook of Main and Fill:

password: embers

I decided to do another fire simulation because my reference had nice collisions from fire that was sourced underneath the colliders instead of just on top of the wood.

I grabbed a portion of the large log asset and applied similar sourcing techniques as the main fire with noises.

Fixes/Caveats for this week:

  1. BIG FIX so its in bold - Density is not written to during simulation if emit smoke is turned off or there is no density being injected or targeted. As per the documentation: "For a smokeless pyro simulation, this volume [density] has a value of 0 everywhere." Meaning my render engine will not pick it up and thus the reason it wasn't rendering in the first place, but my steam was because I was injecting density. The simulation was producing a density field, but it was empty. The lesson: You do not have to inject density into sparse pyro for it to simulate properly. However, you DO need a density field in some fashion to properly render your flames, if you chose not to inject density. The workaround if you don't want to inject density: Turn on emit smoke on the pyro solver; in the pyro-post process or look book and the pyro shader, set the density scales to 0. The documentation provides another method: ( - I however didn't get it working and am not using mantra anyway.

  2. This leads me to my next caveat: the workaround mentioned above does not work with Renderman because those functions are native to Houdini shaders. I will reverting back to injecting density into my simulation for my sanity later.

  3. Technique for sourcing volume collisions was incorrect - using volume source for collisions should be plugged into forces, instead of sourcing with the pyro fields.

  4. When creating the VDB for collisions, make sure there are enough interior voxels, or better yet that the collision is filled (check on fill interior).

- static objects are another method you can use; it works well out of the box, but using

the volume source is more efficient bc you have that field control very easily.

- If you're using the volume source and it doesn't seem to be working here's the check


- "watertight" geo; if its extruded make sure it has enough thickness or better yet if

its like a pot, cap it and then turn into a VDB

- Calculate point normals and feed that to the v attrib before making the geo VDB

- in VDB from polygons - change the distance name from "surface" to "collision";

add a surface attribute for point.v, pointing to the v VDB grid and the vector type

should be dis/vel/accel

- make sure volume source is plugged into forces for sparse pyro and sourcing for

legacy pyro

Note: The higher resolution the simulation is, the more chance for collision "leaks."

The reason to add velocities from normals to collision geo is to keep any fields from

"sticking" to the colliders.

For other stuff on volume collisions I recommend checking out HoudiniSimon's Houdini Volume Collisions series on Youtube:

But as always: do more research and compare what you find. I wouldn't mix the methods as he does in his video because it could get confusing.

Grid-aligned artifacts: this a pretty common issue in pyro that happens even after increasing substeps on the pyro solver due to having strong velocities on one axis (in this case the up y direction); or strong divergence in the velocity source; or the voxel centers of the sources are lining up (ex. scattered a perfect grid of points that's the source.)

In my case, I'm seeing it mainly stretching lines through the flames so I'm assuming that's due to my velocities. It may be solved when I add microsolvers to move the flames around.

Steam Simulations-

Main Spout Simulation:

Flipbook of pop source and pyro simulation:

password: embers

Made some decent progress here with steam from the spout. I have an emission motion that I quite like. I started with a pop sim, so that the source had the desired emitting motion and then the pyro solver would take care of the dissipation. There's a number of artifacts from the lack of points and high velocities from the pop sim I will be addressing next week.


I'd like to do some more density post-processing right at the mouth of the spout to achieve a look similar to that in the second reference clip. Where there is the most speed in that area, it is less dense. Like this:

Fire Shader Progress-

Left: goal (Houdini pyro lookbook)/ Right: current Renderman volume shader from scratch

The thing that sent me down the density field rabbit hole that I mentioned earlier was trying to properly render the density of the flames. Originally, I had a big gray puff with huge voxels and no emission.

There's an example of fireball shading from the Renderman 21 documentation ( , but I found this to be unsuccessful in both color and emission, mainly from the usage of the pxr blackbody. With the blackbody I got very hot pink colors. I eliminated the usage of that entirely and created custom color ranges to follow the new shader workflow that is native to Houdini.

The density is simply fed into the density primvar of the pxrvolume. Then I grabbed the flame and temperature fields for the diffuseColor and emitColor. Applying simple multiplication operations allowed me to get a pretty good result for a little bit of work. I need to work more on the temperature look and making this a light source shader, as well as making the flames appear a little more 3D.

Tip: If youre using pxrvolume and feeding a density field, change the Max Density parm on the volume shader to something higher than -1. If set to -1, it means the density will go on into infinity. For me, by setting the max density to 5 I got a much more realistic result (also in mix with some light density post-processing).