Sticky Vellum Fluids

With the main character of the animated film being a big bear who loves (at times, gravity-defying) honey, I knew that the FX team had our work cut out for us. Following the director's vision for how the honey should behave in each shot, I shaped the honey using viscosity attributes, glue constraints, and attach constraints inside a Vellum Fluids simulation.

For a shot where the honey on the bear's hand needed to stick to a tree branch and stretch without breaking, I dynamically added attach and glue constraints to the Vellum fluid as it got close to a specific section of the branch. Animating the stretch values of the glue constraints allowed me to keep the honey strand stretching without it breaking apart.

In another shot, a pair of garden shears cuts through a thick strand of honey. I started by modeling the initial shape of the honey strand. After converting that shape to a Vellum fluid, I created attach constraints to anchor it in place and glue constraints between the grains of the fluid. Then, based on the closeness of the garden shears to any given glue constraint, I dynamically removed constraints that would be cut by the shears' motion. This method gave me some visually interesting shapes in the honey strand, and I was able to tweak the shapes and simulation further by manipulating the glue constraints.


Grass Groom & Sim Tool

Since our film takes place in a large garden with a lush lawn, I wanted to set up a tool that would allow all of the FX artists to generate and simulate the grass while keeping the look consistent between shots. I also wanted the tool to shade the grass and prepare it for publishing into our USD pipeline.

First, the tool imports all ground planes relevant to a shot into SOPs and creates custom maps for grass density, type, and height. These maps are based on art direction and notes from the film's director. Then, the tool uses the shot camera to create a frustum that accounts for camera movement and culls irrelevant pieces of the ground planes. This reduced the amount of grass that needed to be generated for a shot.

Using the grass density, height, and type maps, several layers of grass are created on the remaining ground-plane geometry with the Houdini Grooming workflow. This includes short manicured grass, long wild grass, and grass that breaks up the silhouette of the lawn perimeter.

Once the grass field is generated, artists can choose which USD objects to use as colliders in the grass simulation. To save time and disk space, only grass within a small radius of the selected USD colliders is simulated. These grass curves use Houdini Vellum Hair, which gives great control over stiffness and plasticity.

After simulation, the tool creates the attributes necessary for the curves to render in RenderMan, our production's render engine. To save disk space, the curves are rendered as ribbons. To avoid a uniform look, the tool calculates each curve's normals to face the shot camera, randomizes them per curve, and then twists the normals after a randomized point along each curve.

Finally, to prepare the grass curves for publishing into a USD pipeline, the tool imports them into LOPs and assigns a procedural shader. Unsimulated grass publishes as a single static-frame USD file, while simulated grass publishes as a per-frame USD file.


Car Crushing RBDs

One of the hero FX in the film was a beautifully vintage truck getting smushed by a gigantic tree. I took on this shot not knowing how to approach it, but chose a Houdini Rigid Body Dynamics workflow with custom constraint networks for each material in the car.

By separating each material into its own constraint network, I had a lot of control over the shapes and breaking of every piece of the car. It allowed the metal to behave differently from the wood pieces on the back, which was crucial to making the FX feel realistic. After simulating the main body of the car, I added layers of debris, including breaking glass windows, metal shrapnel, broken wood chunks, and detached tires sailing through the air.

Once the combined car and debris simulations felt good, I added storytelling elements like honey bottles flying out of the back of the truck and a puff of dust from underneath the car as it gets squished.

I also wanted to add motion to the falling tree. Using the animated broken tree trunk as a guide for the main motion, I simulated tree branches colliding with the cliff wall through a Houdini Vellum Hair workflow. I created spines to represent each branch, simulated those spines as Vellum Hairs, and used them to drive the deformation of the branch geometry. Finally, I procedurally added leaves to the branches and deformed them to follow the branch motion.


Vellum Plant Interactions

The story of "Honey Business" revolves around two things: honey and destruction. A main story point is that our big, honey-loving bear unknowingly destroys a beautifully curated garden. We had several shots that needed realistic interaction between the bear and the plants he was destroying.

For these shots, I used a Vellum Hair workflow. First, I created either a spine or lattice that represented the plant asset to be interacted with. Then, using Vellum Hair constraints and dialing in the stiffness and plasticity parameters, I simulated the bear colliding with the Vellum Hairs. Finally, I used the simulated hairs to drive the deformation of the original plant asset. This workflow gave me a lot of control over the motion and stiffness of each type of plant and resulted in great interaction.


Plant Keepalive Tool

With so many plants in our garden set, I wanted an easy way to make them feel alive without having to simulate them in each individual shot. Thus, my plant keepalive tool! After bringing the tool into a shot, artists could select which plants needed keepalive motion, and the tool replaced the static asset with a pre-cached animated instance of the same plant with matching transforms.

Inside the tool, the selected plants were unpacked to make their centroid point accessible. Then, the instances' intrinsic packed transform matrix was saved to a point attribute for later use. By parsing each plant's USD path attribute, the tool identified the plant type and assigned it to the point as a name attribute. Using this name attribute, a pre-cached, Houdini-Vellum-simulated version of the same plant was copied to each point.

The stored packed transform matrix made sure that the animated plant matched the exact orientation of the static plant. Finally, the tool brought the animated plant instances into Houdini Solaris, reassigned each asset's materials, and removed the originally selected static plants to avoid duplicates. These new animated plants were then ready to publish in their own USD layer, so no work from the environment team would be lost.