
3D Modeling and Look Development
Entry 6: April 10th, 2026
Recently, I finally figured out a successful method for implementing a frost spreading effect using a transfer between two textures (one regular material and then a second frosted over version of the same material). While the method itself is quite simple and easy to set up, a major downside is it requires very high-poly mesh. As a result, I've had to reorganize my scenes/file structure and find additional ways to optimize, but I've had no issues with render times or scenes running slow.

Full material transfer FX set-up (left) and remesh of test model (below)

I used my plate asset to test this method, and started by using subdivide and remesh tools to add more geometry detail to my model. Then, I added in a 'Distance Along Geometry' node and selected a couple start points where I wanted the frost to spread from, followed by an Attibute VOP.
Inside the Attribute VOP, I used a 'Bind' node to reference the distance measured by the 'Distance Along Geometry' node, and created an offset parameter in an Add node that could be used to animate the spread. The fit and ramp node create a range of distances that can be fed into the geometry color to create a gradient from black to white depending on each vertex's distance from the start point.

Node graph inside Attibute VOP (above) and plate w/t color gradient from Attribute VOP (below)

Finally, I added noise within the Attribute VOP to make the frost spreading look more natural/imperfect. I also animated the offset of the noise pattern to push the natural look of the spreading even further.

Color gradient with noise added in Attribute VOP (above)
Playblast of final material transfer test (above)
Finally, the geometry color --with the final transfer effect on it-- can be referenced in the material library in the stage using the 'Geometry Color' node and used as a mask for the 'Mtlx Mix' node to combine an icy version and a normal version of the textures.
Entry 5: March 8th, 2026
After receiving feedback from my peers that my pyro FX were too candle-like and not accurate to the size of torches I have in my scene, I've found new references for my torch flames and will be making my fire larger and more turbulent/animated. In my second pass of the torch effects, I've turned on the turbulence and decreased viscosity to add more flickering. I also increased the bouyancy to make the flames taller.
Test Iterations of Flame Movement (above)

Torch Flame Before (left, above) and after changes (above, right)
Now that I've reached a point where I'm satisfied with the flame movement, I will be replacing the torch flame that gets blown out with this updated pyro sim and adjusting the extinguish animation as needed.
Entry 4: Mar 4th, 2026
After further testing of my initial Freezing FX --using Pyro Spread and booleans to make a faux material transfer"--, I hit a dead-end when I tested the FX with my actual textures and discovered that there were serious UV issues.
Technical Issue w/t UVs in now-scrapped freezing FX workflow
After some consideration, I decided to drop my old FX pipeline entirely and start over from scratch. I did deeper research and found a Houdini tutorial by Junichiro Horikawa on making actual frost geometry using solvers.
​​
Frost Wrapper Tutorial: https://youtu.be/4I3zVgGuSmw?si=1lbHDGN0FqTjvpW_

Frost Wrapper with color-coded types of frost branches, skewered to have the yellow type more frequent (above)
I made 2 primary changes to Horikawa's code.:
-
Randomization of frost branches type -- Horikawa's tutorial created 4 different types of ice branches (color-coded) and each branch of frost was assigned a type based off a random float between 0-1. I changed to range to 0-4 and skewered the range values so that one type of branch (the yellow) was more common than the other variations.
-
Freeze Starting Point -- Horikawa's frost starts generating on random points over the entire geometry. I changed the code to select starting points based on y-pos so the frost would spread from the bottom of my goblet upward.

Still of frost FX w/t WIP ice material in Shot 13 (above)
Entry 3: Feb 18th, 2026
This section was unfortunately deleted in a bout of 2 AM brain fogginess :(
I will be rewriting and redocumenting the second round of iterations to the candle effects late.
Entry 2: Jan 25th, 2026
While I'm still working on my textures, I've taken a break from working on the spreading ice FX and have started working on my candle flame FX. While the effect is simple, I've never worked with Pyro flames before so I did some research beforehand to ensure I had all the tools and reference I needed and followed an online tutorial for the basic set-up

Base set-up for candle flame​

Pyro solver fields

Pyro solver look settings
I made some minor changes from the tutorials settings for flame lifespan, dissipation, and fire intensity to start trying to get the shape I wanted. Then I used a volume visualization node to reassign the flame color and opacity to get the subtle blue glow at the base of candle flames.

Then, I experimented with the animation of the flame extinguishing. Although not as physics-based, I found the simplest and quickest way to achieve the desired affect was to just keyframe the pyro source disappearing and wind speed/direction in the pyro solver. Next week, I'll further explore the flame shape and making the peak rounder, as well as refining the extinguish animation to have more turbulence.
Entry 1: Jan 10th, 2026
Initial research and planning for the Freeze Spreading FX started in October 2025. I knew I wanted to use Pyro to create a more natural spreading effect and set up the basic pyro workflow with Houdini's test geometry.
​
After winter break, I revisited these tests and started experimenting with the freezing aspect. To reduce render times, I am creating a second, frozen version of all materials and will only be using actual frost geometry in close up shots. The frost growth FX and frozen material transfer will both be using the same pyro spread but simmed seperately.

Pyro spread set-up


Pyro spread set-up (cont.) + spread visualization (left)
Initially, I wanted to do the frozen material transfer using animated texture maps, but quickly ran into difficulties with using image sequences as a texture map in MaterialX. Therefore, I pivoted at decided to try using booleans to cut my geometry into two seperate meshes (frozen and unfrozen) so I could assign a seperate material to each part. This method proved to be much more successful

Frozen mesh

Non-frozen mesh

Frozen + nonfrozen mesh combined (with WIP frost growth