Technical Artist Jack Hidde Glavimans shared the workflow behind the VESSEL project, showed some interesting grooming techniques in Houdini, and explained how the creatures were rendered in Unreal Engine 5.
I am Jack Hidde Glavimans, currently a 23-year-old student about to start my last year at the Breda University of Applied Sciences (BUAS) in the Netherlands. Over the past year, I have been contributing to almost every student project in my year, which includes four game projects and the virtual production project called VESSEL. I had this opportunity because, in my study year, you can join an outsource group that serves the other student projects as an outsource studio would serve other companies.
Thoughts on Houdini
Before the BUAS, I learned the very basics of 3D at the Graphic Lyceum in Rotterdam. There, I learned to model in Maya, and after that, I learned SubDivision modeling, which keeps your models tweakable while having the ability to see them in high detail.
Two and a half years ago, I got introduced to Houdini. Since I was already familiar with the benefits of keeping your work tweakable, I was interested in procedural modeling from the start. Over these years, the SideFX team has not let me down with improvements to Houdini. I am looking forward to the improvements on the KineFX system, Houdini's new way of rigging which in my opinion, will be running circles around Maya soon. Other updates that are promising, in my opinion, are updates to Vellum, PDG, Houdini Engine, modeling tools, and the Grooming toolkit.
In my opinion, Houdini is not that scary. Houdini is forgiving because everything you do stays intact. What you do need, and what may seem challenging for most people, is the drive to solve problems all the time. There is not really a point in Houdini where you will know exactly what to do, there is a certain problem, and you must find a solution.
Houdini for Grooming
As with KineFX bringing rigging to the SOP context, where you can manipulate it like any other geometry, grooming in Houdini also stays close to SOPs, making it so you can use all tools you already have in Houdini on your groom if needed.
For me, having worked with Houdini a lot for geometry generation or procedural geometry, it was nice to have my groom exist in that context because, if needed, I could treat it as just geometry. I think the grooming process itself is similar to many other tools, where it comes down to how editable your groom is. Because Houdini is just all nodes, everything stays destructive and procedural. You can easily reorder or branch out with new tests/ideas while keeping the other versions intact. Even if the underlying geometry would change, I could simply transfer the attributes from the nearest geometry, transferring all my hand-painted masks.
The VESSEL Groom
First, I had to prepare the mesh, created by David van Dijk. I used Transform to make sure the scale of my geometry is correct; this is important for export and in case I want to use simulation. I like to remove all the attributes that are on the geometry that I do not need, if you work with a lot of points/polygons, this also speeds up your network.
Then, I separated the geometry so that I only have the faces left where I wanted hair, so I removed the eyes, nails, tongue, or cut out a section of a head. The less geometry you work with the faster your network.
After the geometry is prepared, you study the hair flow from your reference, and to make it easier for yourself, you can add lines to separate different areas and easily see where direction changes are.
After that, it's time to start painting masks on your geometry, placing the guides where needed, and generating the hairs. This is all one step because you will be going back and forth, adjusting paint masks while sculpting your guides to get the look you need for the hairs. The groom nodes need two outputs the skin geometry with masks and a VDB from your mesh, the latter is used to make sure the guides you draw collide with the skin, preventing intersections.
You create your guides inside the Guide Groom object with Guide Groom nodes which can be chained, while guides created in earlier Guide Grooms are still editable in later ones.
Since this groom was rather simple, I used only three Guide Grooms, one to sculpt the base, a second one to scatter more guides in between, and a third for final tweaks to the overall shape.
When I got the base guides in shape, I added more density, a HairGen, and started playing with guideprocesses/hairclumps to give the hair the effect I wanted. Controlled with painted masks to control where each effect takes place and how much.
You can paint any mask you want for almost every parameter in all the guide toolkit nodes. Set a base value and select a skin attribute in the drop-down, then you can any attribute that you created on your geometry.
In Unreal Engine 5, the color of the hair is depending on the color attribute of the hair curves. When Houdini scatters points on your geometry to place each hair, every one of those points knows on which primitive(polygon) it is scattered on and its PrimUV location, where their position is relative to the positions of the 4 vertices making up the primitive. This is in an XY, 0 to 1 space.
I wrote VEX code that does this process in reverse. I have the vertices that have the UV coordinates of the texture and I use the PrimUV value to interpolate between those 4 UV coordinates to get the UV locations of the hairs on the texture.
After that, it's just a simple function that gathers the color data from the texture at the UV position and stores it on the hair primitive.
In Unreal Engine, you need to make a material for the hair, I just used a basic setup from Unreal's documentation. The important step here is to take the BaseColor from the Hair Attributes node since this is where our color from Houdini is saved. Furthermore, to prevent the weird behavior of your hairs in Unreal, I had to set up a good physics asset to prevent the hairs from being pushed around by these colliders.
The setup for the groom itself was not that time-consuming, and once you have your nodes down, the long progress is getting all guides in the right shape and tweaking the paint masks accordingly. I encountered issues where the Unreal groom starts glitching if there are more than a certain number of hairs on the groom, reducing hair count solves this and I think this number depends on your machine.
If you want to master grooming in Houdini, I recommend learning how to use VEX. It gives you room to think, test, and validate whatever you are trying to do. Houdini can do a lot, but if you can, try and start with Surface Operators, learn the basics of manipulating geometry and reading the geometry spreadsheet.
If something does not work and you can not figure out what might be the problem, remove processes/nodes until your problem disappears or you end up with the simplest case. If it works, add the complexity back in and you’ll eventually see where it goes wrong.
Visualize as much as possible, use slider parameters to see what effect changing values have on your system. And don’t give up, go to sleep, and try again tomorrow!
You may find these articles interesting