Hair transformation and simulation for film
Image Engine teaches us their genius techniques
In this tutorial we’ll take a look under the hood at the hero simulation and transformation of Grindelwald’s hair, featured in Fantastic Beasts: The Crimes Of Grindelwald. We’ll start with two static grooms, use houdini’s wire solver and work with sops to produce a final hair performance that’s ready to render.
We will touch on some artistic considerations and explore the less procedural workflow that’s necessary to direct these shots. We’ll also talk about some methods that make the hair easier to work with and give more control over the final look.
Regardless of what tools are used, a hero effect needs to first focus on the desired performance and feel of a shot, much like an animation would. This should be established before refining any details.
in this case we want to focus on realism and subtlety. The hair needs to react to the motion of the action, reshape and move across the surface of the head.
it needs to be done in a way that doesn’t take attention away from the face.
The intrinsic dynamic properties of Grindelwald’s hair – and Abernathy, the character he transforms into – should be emulated. These properties can be inferred from plates or additional reference of someone with a similar hair type. The transformation should be timed nicely with the motion of the head, and be broken up to not feel linear.
The approach taken in this setup is aimed to allow as much artistic control and iteration speed as possible. hair is broken into passes based on how it should move, simulated separately, and layered together using sops.
Working this way we can focus on the realism of the simulated motion without being distracted by trying to make wires behave differently in the same sim. The layers are combined in specific ways, and animated manually to work in conjunction with the motion of the character.
We use two simulation steps to add fine detail without sacrificing control over the base motion. This requires manually creating a subset of guide curves to make sure the hair moves how we want it to.
When it comes to finalising the look, sops are used to really define the finish of the hair.
A single set of curves is used throughout each shot, transforming from wavy and frizzy to straight and styled, and in one case the finish is wet and clumped together.
Assess the groom and guides To start let’s take an in-depth look at the characteristics of the groom. What type of hair does this character have? how will it need to move? What attributes are already available on the curves? Grindelwald has wavy locks and frizzy strands. These elements should be treated separately since they’ll move differently. his guide curves have ids which match a guide id attribute on the groom.
This is important, we’ll need to generate those if they don’t exist. We also need point ids and uv attributes for all curves and groups to separate frizz from locks.
Generate group ID for sub-guides Grindelwald has too many guide curves for his hair type. each lock of hair should stay together, so we need one curve per lock. For best results, group the guides by hand. select some curves, use split to isolate them, then invert selection. set inverted as default for the split node. using the q hotkey to repeat last command, quickly make selections and generate a long chain of split nodes.
When finished, connect the second output of every split to a switch, and use a loop to assign a group id and to merge the curves back together.
Generate sub-guide curves now we’ll generate sub-guide curves. iterate over the original guides in a loop using the new group id. in one stream isolate the curve roots and add a point in their centre. in the other stream use Resample to create a tangentu attribute pointing along the curves. Generate a velocity field based on tangentu using the fluid source node.
now use Volume Trail to trace a curve through this field starting from the centred root point. Transfer any needed attributes to this new curve, and make sure its prime id matches the group id on the original guides.
Simulate the sub-guide curves speed is king. Aim for one to two minutes per iteration. Localise the sim to make it easier to work with. Focus on a small section of guide curves – the rest of the hair will respond the same way. Reduce the collision resolution. use substeps to deal with high frequency motion, not to fix exploding wires. explosions can be fixed by properly balancing settings. Once we are happy with the motion, sim the whole set of guides and start increasing collision resolution, accuracy and substeps. Rogue wires can be fixed post-sim, don’t adjust the whole setup for one or two wild curves.
Simulate the guide curves now use the wire deformer to bind the guide curves to the subguides. We can wire capture post-sim by using the matching sub-guide/group ids. The goal is to introduce secondary motion on the finer guides while preserving the motion of the first sim. This is a subtle effect but will add realism to the final look. use the same strategies as in step 4 to iterate as quickly as possible.
Do it all again (and again) Grindelwald needs to transform into another character (Abernathy) who has his own groom, so we’ll need to repeat steps 1-5. At this point we can also run separate simulations for differently behaving hair, like Grindelwald’s frizz, or to get a directed performance out of a specific bit of hair.
Focus on the needs of each section instead of trying to make one sim that will work for everything. combine the sims so we’re left with one set of simmed guides for Grindelwald and one for Abernathy.
Identify blend targets for transformation Let’s start the transformation. Working with static guide roots only, deform Grindelwald’s points to Abernathy’s head. The grooms are parted differently, so shift the points accordingly. create a master array detail attribute. For each of Grindelwald points compare the nearest Abernathy points to the master array until we find one that’s not in the list. That’s our target. Add this target to the master array, and finish iterating until all points have a target. The characters have a different number of guides – almost 3:1, so run this process on a third of the points at a time.
Animate blend transition now that we have our targets, we need to animate the transition. copy the target ids from the root points to the simmed guides. Animate the blend as desired, adding time offsets and speed variation to make the transition less linear. snap the curve roots to the transforming head geometry using ray, and offset the rest of the curve to preserve its shape. since we have three curves converging to one, only blend to about 95 per cent of the way and use noise to add some slight variation to the target shape.
Focus on the needs of each section instead of trying to make one sim that will work for everything
Clean up transforming guides At this point the guides are looking pretty good, but there’s a bit of mess to clean up. Fix stretching. Blend any weirdly moving guides with static bound guides to dampen their motion. Ray any intersecting curves to the outside of the head, carve them to the correct length, then resample back to the correct number of points. in this case we see the hair intersecting the eyebrows, so offset the collision geometry to account for this.
Bind and deform groom it’s time to deform the full groom! use the matching guide ids on on the groom/guides to wire capture, then wire deform the groom to the finished guides.
use a matrix to pre-transform the groom and static guides to roughly match the transforming head geometry. This will minimise the distance the wire deform needs to move the groom, improving the look of the deformation.
Add fine details now we need to finish the look of the hair. The hair is shrinking from long to short, and should be transitioning from wavy to straight. Right now the waves are getting compressed and and even more curly. use a combination of resampling and blending to smooth the shape. Push the hairs towards their guide to blend down the frizzy hair, or to create a wet look where required. control these effects using a uv attribute and ramping along the length of the hair. snap the hair roots to the head geometry with a falloff to avoid kinked curves.
Clean up data and render! Looks good – now clean up any unneeded attributes, and make sure all render attributes have been preserved. The easiest way to do this is to copy the final P and any other needed attributes to a freshly loaded version of the groom by point id.
Remove any missing hairs, move back to world space, then calculate velocity and acceleration. cache that out and we’re ready to render!
use a matrix to pre-transform the groom and static guides to roughly match the transforming head geometry. This will minimise the distance the wire deform needs to move the groom, improving the look of the deformation
Bio Michael is an FX lead and generalist TD who has been working with Image Engine Design Inc for just under seven years.