David Gao described the process of creating a Mystique skin transformation effect from X-men in Houdini.
In case you missed it
Learn more about VFX production
Sentinel Series
My Sentinel Series started from researching the Mystique transformation effect from X-men. This led me to a video on Youtube channel Moder More that demonstrated this effect using a scale with separate materials on either side and flipping them in a wave.
This inspired me to attempt the effect myself as I first began learning Houdini 2 years ago. Since then, I created subsequent iterations of the effect as my knowledge in the software grew.
I included the hip file for the base effect in the description of this youtube video so you can easily follow along!
Base FX
Because I created this effect when I only began learning the software, the concepts covered in this section are beginner level.
We will first create a double-sided scale.
To create the contour of the scale, we begin with a line in the Y-direction. Then, with an attribute wrangle, we can sculpt the contour of the line by shifting the X-value.
First, we get a normalized length along the Y-axis:
f@norm = (@ptnum*1.0) / ((@numpt*1.0) - 1);
Second, we will contour the line along the X-axis using a ramp and include a variable we can scale by:
@P.x = chramp(“contour”, @norm, 0)*ch(“X_Scale”);
Using a Mirror SOP along the X-axis, followed by a Skin (Groups of N primitives), Fuse, and PolyExtrude (enabling Output Front/Back/Side groups for applying material later), SOP will give us the scale/leaf shape with divisions along the horizontal axis. The scale also must be transformed along the Z-axis for the Copy to Points used later on.
Now we need to create the geometry to copy the scales onto. In my first sentinel, I used a Mixamo animation, but for this base example, we can simply experiment on a grid. I started with a grid of a size of 5 x 9 with 22 rows and 8 columns. In order to properly copy these scales onto our geometry’s point, we will need to calculate the Normal and create an Up vector ( 0,0,-1 if we want the scales to lay flat on the Z-axis in the beginning). Additionally, we can add some irregular detail/patterns in the scales by adding a noise to the X and Z-component of the Up vector, while keeping the Y-component at 0.
The next step is to transfer an attribute that will control the rotation and the scaling of our scales on the object. The easiest way is a simple distance-based attribute transfer and a solver to maintain the transferred values. Here's a tutorial that goes over this if you are not familiar with this concept:
The rotation will need to be maintained, as we want the scale to stay flipped after the transformation occurs. The scaling is only temporary, as we want the scale to become larger only while the transformation occurs. I created a simple line that moved across the grid and used an attribute transfer with a color value of (0.03, 1, 0). I gave it a distance threshold of 0.01 and Blend Width of 1. This may vary depending on the scale of your grid.
The Green component will control the rotation and is much smaller because the solver will accumulate this value quickly. This value must be adjusted based on the speed of the line. The Red component will control the scaling and bypass the previous frame addition.
The next step is to create a For-loop that will copy these scales to the grid. In the For-loop, we will create an attribute wrangle that will remap the Cd values into our scale and rotation value. If you want to highlight this effect in slow motion, you may want to implement a bending attribute as well. I remapped this example to these values:
f@rot = fit01(@Cd.r,-90,90);
f@bending = fit01(@Cd.g,-90,90);
f@scale = fit01(@Cd.g,0,1.5);
We can now add a bend and transformation SOP before feeding it into the Copy to Points SOP. To access the attributes created in the attribute remap, we will add a spare parameter on these two SOPs through the settings dropdown menu and drag the attribute wrangle into this slot. These two nodes will now be included in the For-loop, as shown by a purple wire. In the Bend SOP, I used this point expression to call the bending attribute:
point("../attribute_remap",0,"bending",0)
In the transform SOP, I used the point expression to in the rotation, uniform scale, and Z-scale as shown:
We can lastly add a Delete SOP in the For-loop deleting points with the scale attribute of 0 with the expression @scale==0 to clean up the unnecessary geometry.
Now we are done with the scale component of this effect.
To change the material underneath the scales, we can utilize the same SOP solver we used and blend the material using the Red component. This method will depend on the type of renderer you are using. For Redshift, it would be through the RS Material Blender.
Secondary FX
To give this effect some detail, we can add some smoke and particles to the transition area. By isolating the Green area created by our solver, we now have the geometry from which we can emit our secondary FX. I used the billowy smoke shelf tool to create smoke and then used the velocity attribute of the volume to advect particles emitted from the same source.
These are all the elements I used to create the first version of the sentinel, which were applied to the animation from Mixamo. I will just give a brief high-level overview of the major additions and differences of the subsequent iterations.
Magma Mystique
For the second iteration of my sentinel series, I created a fire element version with some improvements to the pyro and textures.
For the smoke, I layered many levels of gas turbulence in addition to a gradient-based noise to create a more complex smoke simulation. A good-looking smoke simulation requires 5+ turbulence with varying frequencies. As pyro is such a huge subject in FX, I would highly recommend watching this masterclass by Jeff Wagner to learn more:
To create the magma texture, I used an asset of volcanic rock from Quixel Megascans. I took the displacement texture, inverted, and clamped it to create the effect of light emission from the cracks of the texture.
Arctic Mystique
The third ice iteration of the sentinels has a few more added elements. Instead of just a material blend occurring on the base geometry, I deleted the skin to reveal a fragmented ice sculpture. To create this geometry, I first timeshifted the Mixamo animation to the first frame. I then used the RBD Material Fracture node’s glass preset to create a glass shatter pattern. I deleted some parts of the shattered geometry to give it a more broken and incomplete look and point-deformed the result to the original animation (point-deform SOP is such a quick life-saver in so many situations). To create a more mist-like smoke, I created a more buoyant smoke simulation and added a custom velocity field with a curl noise.
For the shading of this sentinel, I again utilized Quixel Megascans. For the base skin, I used a snow texture and added subsurface scattering in the Redshift material. For the ice specular material, I used the roughness and displacement of ice from Megascans and added a bit of green in the transmittance to give it more color.
Deep Sea Sentinel
My final iteration was inspired by past work I have done with emissive lights running through specular wires:
Similarly to the arctic sentinel, I deleted the skin to reveal a different geometry underneath that was point-deformed to the original animation. To create the wire pattern, I scattered points onto parts of the original geometry that I selected and then used them as an emission source in a POP network. In the POP, I used the minpos expression in a popwrangle to stick the particles to the geometry. I then trailed these points to create the curves that were then swept into wires. I then copied emissive spheres onto the original particle simulation to create the effect of lights moving through the wires. In the shading, these spheres were hidden from the primary ray, so that only their reflections on the wires were visible.
David Gao, FX Artist
Keep reading
Previous interview with David