Case Study: Milk VFX, Beowulf and CG fur using Yeti

Case Study: Milk VFX, Beowulf and CG fur using Yeti

We are very excited to share this detailed case study prepared by the team at Milk VFX who used Yeti to bring almost every creature to life for the new series, Beowulf.

Incredible work, Milk!


“ITV’s new series Beowulf, helmed by Walking with Dinosaurs producer Tim Haines, is based on the oldest English poem of the same name. Milk was awarded all vfx work which meant we were responsible for bringing all of the creatures to life. We collaborated closely with Tim Haines and knew that from concept stage that we’d be having to add fur and hair to nearly every creature on the show from the protagonist Grendl to the wolf like Wulfingdogs.”

Choosing a fur tool.

“CG fur and hair has until recently been very much a luxury of film work given the time and research required to get it looking believable (i.e., Life of Pi, Tangled, and The Planet of the Apes films). Given fur is a real world asset, there are certain rules and behaviours we have to abide by in order to convince audiences that what they are seeing is real. We needed to find a tool that could help us achieve this. We had used Yeti previously on the feature film Hercules with great success.”

“At that time we were using the feather features introduced in Yeti 1.3 which were still quite a new asset to the Yeti toolset. Anytime we ran into a problem or requested a feature, the Yeti team were quick to respond and help out. The support we received and the features available to us made using Yeti in Beowulf a no brainer. A lot of the creatures in Beowulf also required varying fur/hair styles on different parts of their bodies and this was easy with Yeti. We could create multiple graphs inside one node and then simply duplicate setups and even reuse them on other creatures if necessary leaving us with just a small amount of tweaking, this flexibility was key.”


“In episode one alone, we are introduced to three very different looking creatures and they would appear in no less than 100 shots, fur and all. I can’t think of another TV show to date that required such a heavy need for CG fur, which meant we had our work cut out.

The first part of the fur development was to take each creature model, create a fur groom which would roughly take 2 to 3 days and then attach it to the look development scene so we could test how the fur would look as part of the final creature design. We’d create turntables for client reviews and make changes according to their notes.

Once a groom had been finalled, we needed to figure out how we would populate each shot with fur. Each groom needs to be attached to the animated creature mesh on a per shot basis, then cached to file and loaded into the final creature template scene that had all the working shaders and lighting. This meant a lot of manual time would be required. At this stage we hadn’t even considered dynamics, and we wanted to avoid heavy dynamic tweaks being done on each shot. It became clear that we had to figure out a way to streamline the fur dynamics and caching process for each shot.”

Fur Dynamics

“To test the dynamics, we ran our groom lookdev scenes through a number of different animation cycles all the while adjusting the dynamic settings until we felt we had something that would work in all circumstances. Our goal was to have just enough dynamics to add a nice amount of weight to the fur as it collided with the body, horns, etc. whilst still maintaining the original groom pose. These settings were then stored for each creature.”

“In summary, our Yeti pipeline consisted of a 3 step process for each shot.

  1. Bake the tension displacement to a single tile map sequence.
  2. Add displacement to the animated mesh thus offsetting the Yeti node that is attached
    to this mesh.
  3. Set a pre­roll, assign the optimal dynamic settings and bake Yeti to file (cache).”

“To simplify things further, our in-house technician, Alexandre Pavot, created a UI which ran all these steps automatically on the farm. All we had to do was provide the UI with the animated creature alembic cache (which stored all shot information in the filename) and it would automate all the steps and deliver them to the farm leaving us with a final Yeti cache.”

Getting Dirty

“On previous projects, due to software limitations, it was a challenge to attach dirt or snow for example to fur and have it move with the fur as though stuck within it. With Yeti, we knew we could add instance geometry into the Yeti graph on the same groom curves. So we created four distinctive dirt objects and scattered these through the fur by introducing instance nodes to the graph. We could then randomise quantity, size, rotation and position along the groom curves.”

Shading and Lighting

“For Beowulf we decided to use the AL shaders (a group of shaders created for Arnold by Anders Langlands) for all the CG creature look development. This meant we could use the included hair shader allowing us to take advantage of the extra features absent in the current Arnold hair shader. For example, we could add kajiya­kay scattering, dual specularity (a broad and tight specular at different locations along the length of the hair) and transmission to bleed light through the hair giving us nice rim light results. It also made creating ID’s much easier (they are built into the shader) because often you struggle to retain the opacity in fur when creating ID’s. All of our renders required that we create deep aov’s and this shader set worked perfectly with Yeti for this purpose. For the dirt we were able to create custom attributes in the Yeti graph that fed into our shading networks allowing us to further adjust their look separate to the main fur shader.”


You can watch a breakdown of the Troll creation and sequences here and the Grendl here.