For the past few weeks I have been busy developing a set of node-group assets for procedural grooming with Geometry Nodes to be bundled with Blender. This project is the next step in the long-term effort to replace the old hair system in Blender with a new and improved system that is fully based on Geometry Nodes and much more powerful, flexible and customizable than its predecessor.
The goal here was to use the existing (and add some new) capabilities of working with curves in Geometry Nodes. We wanted to create an ecosystem of node-groups aimed at procedural hair grooming that can be used in Blender out of the box. The main focus was to allow a simplified workflow that is purely based on using these node-groups as high-level modifiers and extending their capabilities by moving them to the node editor to use them to their full potential.
This effort was a collaboration with Daniel Bystedt who kicked off the project by making a selection of which nodes would be useful and providing mock-ups of their functionality. Then I came in and built the node-groups based on these mock-ups, made sure they are following a consistent logic and then added thumbnails and descriptions to make them ready to be released with Blender, which is still ongoing up until the actual release.
This system brings the familiar workflow of using parent hairs that can be edited manually and then iterating with procedural operations on top of that to spawn child curves, add noise, clumping and other effects on top of that, while keeping the editable guide (parent) curves intact.
The major benefit here, compared to the old system, is that everything is fully integrated into the rest of Geometry Nodes. Thus anyone that knows their way around those is able to customize these operations on a very granular level. But because the focus was on high-level interaction, it should be easy for people not very familiar with Geometry Nodes to pick them up and include them in their workflow. Something to also keep in mind about this new system is that it makes it very easy to allow for a destructive workflow. You can always apply the modifiers and make manual tweaks for each generated hair.
There are a few aspects to this system in which it is still lacking in comparison to the old one, which has been in Blender for several years. Mainly, those are regarding simulation and the behavior for animating the surface geometry. These will still need to be addressed for future Blender releases to reach feature parity and eventually replace the old system completely.
Large part of this work was also to coordinate with the Geometry Nodes development team what features we needed to add in Blender to make the workflow with this node-group bundle smoother and more flexible.
There is still a whole list of things that would improve this workflow by a large margin but has to wait for Blender 3.6 and onward; on the other hand there is also a list of things that have been improved because of this project, despite the relatively small time window:
Distribute Points on Faces
nodeAnd most importantly:
This is something that will be done more and more in the future, especially for node-groups. The idea is to mainly rely on this method of adding nodes for high-level operations that take away the need for people to build specialized node-groups like these themselves. Even though they would be possible to achieve with existing nodes, that should be possible but not necessary. This will help artists that don't have a lot of technical depth to have an easier time using the node system and help with a less steep learning curve.
Packaging node-group assets just like any other node in the regular download of Blender also means that the possibilities of customizing the interface of node-groups/modifiers need to be improved to the point where everything that the built-in modifiers can do can be replicated with custom node-groups. This has been the plan for a while now, but finally this means that there is a concrete need to improve this, which will help propel the development in that direction.
Until the release, there are still plenty of things to prepare for the nodes to be ready to be adopted by the masses. This includes small fixes of the functionality and how the nodes operate together, cleaning up the messy node-trees, writing documentation the same as all other nodes have it and preparing a downloadable example file that showcases different setups using the nodes in a nice way. But the main work on what nodes are there, how they work and what their parameters are is wrapped up and can be tested in the latest download of Blender 3.5 Beta.
Getting closer to the release of Blender 3.5 we will also follow this up with some educational material to communicate better how these nodes are intended to be used for their full potential. For now I just want to share what I have been up to in regards of working on Blender, outside of the regular film projects that we are working on.
How to animate or add hair dynamics after creating hair from hair nodes?
I just love GeoHair! It's so versatile yet easy to use and it keeps getting better! One question though: is there a way to convert GeoFur into a actual particle System?
@Koen Vissers There is an operator for both directions of conversion. Just search for convert to particle system
. You have to make sure that every modifier is applied.
I've spent a lot of time on hair in 3.5 and always keep render processing in mind, especially for animation, which is the vast bulk of what I am working on. When does the volume of hair on a character become too much for processing for animation with EEVEE? It's easy to get lulled to sleep with the ease of throwing more hair on vs getting clever with placement and shape. Testing hair counts, I took 1200 quads with 1 hair each and put a factor of 25 in the Duplicate modifier, not noticing much slowdown at all (i7, 128 GB RAM, RTX3090) but, is there a rule of thumb to keep in mind when creating hair strands, let's say on a character like Rain or Snow? 100k? 200K?
@Wayne Batchelor For rendering with Eevee it depends a lot on you VRAM as well, rather than your RAM. Besides the amount of curves you also want to keep the amount of control points low. I don't have any rule of thumb for you on that though. But generally both Cycles are more efficient rendering curves directly than generating the equivalent mesh and rendering that.
@Simon Thommes - Also, I've been using Duplicate modifier almost exclusively. It seems you have more control and less hoops to jump through on a stylized human character. Weight painting and extra scalp meshes seem extra steps to add to the processing stack. I know it may (or may not) be much but, I don't know which straw is going to break the camels back.
@Simon Thommes Thanks, I'm always real conscious, maybe too much, of how much work I'm throwing at a processor, no matter how much I have.
Can we use an image texture for creating animal fur with a pattern as in a tiger or zebra using the new hair system?
@Hibiscus Digital Media Yes, you have to use the surface_uv_coordinate
attribute to sample the texture. You can do that in the hair shader or in the geometry nodes tree.
In geometry nodes you can also use the Surface UV
output of the Curve Info
node. That is the same.
@Simon Thommes Thanks a lot. Let me try
Cool work. Is there a way to use multiple clump nodes? I gave it a quick attempt but can't seem to get a good result. In xgen you typical use multiple layers of clumps for size variation.
@Michael Vaughan yes, you can. Just make sure that you're not using the existing guide map but generating a new one for each clump layer.
@Simon Thommes Thank you for the fast reply. When you say generate a new guide map is that just unticking the 'Existing Guide Map' box, or should the create guide index map be use as well?
@Michael Vaughan It mainly means unticking the box, yes. Then you can use the settings to generate the guide map on the fly before that setting. Otherwise you can also use the create guide index map
node instead to have more explicit control over the created guide map.
The fact that there are multiple inputs for the same thing next to each other and it being a bit unclear, which one overrides the other is an unfortunate result of this being implemented as regular nodegroups, which are more limited in how the inputs are presented. That will be improved in the future. I still need to write the documentation to clear this up more.
@Simon Thommes Thanks Simon. I have one more question, would it be possible to part hair Interpolate curves by mask or vertex groups instead of mesh islands?
@Michael Vaughan The parting could be done several different ways, that can in theory already be supported with the Group ID
input of the Interpolate Curves
node. The main issue is that there is currently no good way of combining multiple options like that in a single node-group and I couldn't make the setup modular in a good way either, so I went with the simplest solution of mesh islands. In the future node-groups will get more options of customizing the functionality and UI, then we can include more options by default.
For now, I'd recommend using a surface mesh that is separate from you're head mesh and either actually separating the mesh islands or using an edge attribute like the crease to split the mesh with procedurally.
@Simon Thommes Thanks again Simon. Is there a recommended step for parting hair clumps? The Islands work well for the interpolated hair, but it seems difficult to get a clean part when adding the clumps. I was trying with the Guide mask and Group ID.
@Michael Vaughan Parting is one of the things that are still a bit limited in their support in the first version. We need more flexibility in node UI to support more options there.
If you are using the existing guide mapping from the parted interpolation that should work by default for clumping. The Group ID input should work for custom cases. A few days ago I pushed a fix for that. Make sure you are on the latest version.
The easiest solution here might be to just use a separate hair object for the different parts though to keep them isolated.
@Simon Thommes Is there a way to add a few extra points at the root of the original hair curves?
@Michael Vaughan To add points you need to resample the curves. To extend the curves at the root you can use the Trim Hair Curves
node and set the Pin at Parameter
value to 1, to pin it at the tip.
@Simon Thommes For a stylized groom with around 100 curves, can you recommend a way to control the curves using a handful of bones? Is there a way to keep the shape of the groom and have a basic rigged mesh influence the location of the curve points?
@Michael Vaughan The that animation/dynamics work is still very much unpolished/missing. At least in regards to out-of-the-box tools. Because everything is based on Geometry Nodes you can take full control over the shape of the curves with those. The easiest way to control the hair with mesh, would be probably to create a duplicate of the hair that you convert to mesh, deform that with bones and then transfer the position attribute back onto the curves using the sample index node.
@Simon Thommes Is it possible to have curves that have been converted to mesh avoid self intersecting? In this case, the radius is larger than realistic hair so the intersecting is quite noticeable.
@Michael Vaughan There is no built-in method to solve self intersection. Anything is theoretically possible to build yourself with the existing nodes. But if you are at a level where self intersection is noticeable enough to be an issue, it might be worth applying modifiers and fixing individual cases by hand.
Wow, fatanstic tool! It will be very powerful!
Thank you. The renders feel lighter than with particle-based hair. Is there a way to scale the curves uniformly?
@Bob Klassen There is an option in the trim node to do that instead
Thank you so much for this excellent work!
Join to comment publicly.