The following tutorial is not a step-by-step tutorial explaining how to achieve perfect feather grooming, but rather an explanation of how I personally approach this type of project. It will explain why I make the decisions I show here, in addition to the R&D process, during which I sometimes conduct tests and explore ideas.
The grooming process, and especially that related to feathers, doesn’t have a single definitive or best method; each artist draws on the arsenal of ideas and tools that work best for them.
In this specific case, I modeled and sculpted the animal myself, and I will make the rig myself. Therefore, having a complete overview of the entire process, I can adapt each part to my own vision of the work. However, in most cases, grooming is subject to external decisions and conditioned by the workflow and pipeline of each studio or company. Every 3D recreation process, and in particular that of characters and grooming, begins before opening Houdini (or any other 3D software), in the Pre-Production stage.
Pre-Production.
The first step is usually to gather reference material: photos and videos of the animal or creature we’re going to work on, as well as models of the specific feathers for the bird we’re going to make.
https://www.featherbase.info
This is a website dedicated to collecting and classifying feathers from all types of animals. Another thing I usually do is gather information about similar projects online. Surely someone has already created the grooming for the animal we’re working on, or at least a similar one. This way, we can see how other artists have approached this challenge, what final finish they achieved, and, if we’re lucky, we can get information about how they worked.
In this case, on Artstation, I found several projects of a wide variety of quality, including:
https://www.artstation.com/artwork/L3R9vP by Yuriy Dulich
https://www.artstation.com/artwork/AlLBRz by Leonardo Miranda
https://www.artstation.com/artwork/QnYrrL by Vaibhav Gupta
https://www.artstation.com/artwork/YKo4Db by Mahmoud Kamal
Using Pureref, I created a board with all kinds of images I collected during my research, and I separated some of them into parts: photos of wings, legs, heads, etc.
And I’ve made a small outline of the different parts of grooming, just to get an idea of the variety of areas I’m going to work on in advance.
Modeling Considerations
The pose we’re working in is very important for determining how we’re going to create the groom.
One of the main considerations is the pose of the wings, the angle at which they will be modeled, and how far they will be spread.
In my case, I decided to model it with the wings vertical. I think it’s a pose that reflects the upright posture of this type of bird, like parrots, and unlike chickens or ducks, which I think work better horizontally.
These types of considerations also vary depending on the rigging requirements.
Making them horizontal or vertical not only facilitates grooming but also rigging, so poses at angles other than 90º are usually discarded, as it is easier to align them.
I modeled them piece by piece; the claws, nails, upper and lower beak, eyes, and body are different geometries, and I exported them at different subdivision levels: the lowest level for rigging and a medium and high level for grooming and rendering.
To work on different aspects of grooming, such as masks, I prefer to paint directly on the geometry rather than using texture maps. This is a personal preference, as it gives me the flexibility to make any adjustments within Houdini. And since the information is saved as attributes, I can always manipulate them with nodes like wrangles, attribute blur, etc.
It is very difficult to get a model that works well the first time, so you have to be prepared for possible future changes and adjustments.
GeoPrep
Organization is very important in a project as complex as this one. In OBJ, I created a network just for preparing the different parts and levels of detail of the model.
Using an attributePaint node, I begin dividing my character into the different areas I’ll be working on.
The Wings
The wing will be composed of a layer of main feathers, called “Flights,” and then an inner and outer layer, each with two rows of feathers: “Coverts” and “MidCoverts” (the shortest).
The process begins with the placement of guides that will later be used to replace them with the “real” feathers (although nothing is real here).
Although you can place the guides by hand, I prefer to work as procedurally as possible.
That’s why I decided to select some edges at the bottom base of the wing (1), which will serve as a base for placing the main or “Flight” feathers. Once those edges are selected, I convert that selection into a curve, duplicate it, move it down, and shape the outer wing with the feather tips (2).
And then I resample both curves (base and tip) using the “curve_resample_by_density” node with as many points as I want feathers, and then I generate the guides using those points.
The “curve_resample_by_density” node is a very useful node that allows me to move the points along the curves in a controlled manner, so I can define exactly where I want the feather roots and tips to be.
Then, in a point wrangle, using input 1, I enter the points (1) I have left after deleting the polylines.
And using input 2, I enter the curve I’ve moved, which represents the outer edge of the feathers, where the feather tips will be.
And I use the following VEX code to generate the guides:
vector pos = point(1,”P“, @ptnum); // I read the position of points on the line (2)
int pt1 = addpoint(0, pos); // I add a new point to the geo of input 1, which I call pt1, and which represents the tip.
addprim(0,”polyline”, @ptnum, pt1); // I create a polyline between the root and the tip
We’ve already made progress on the guides, so we’ll work on them again later. Now we’ll study what type of feathers we’ll place there, what shapes and appearances they have.
Flight Feather Modeling
For the Flight feathers, I decided to recreate four different feather models, which I considered the most extreme in shape, and I’ll have them interpolate with each other depending on their location:
The modeling is simple, without clumps or noise, because I’ll control this after I’ve placed all of them, including the interpolated ones. This way, I can create more variety. So for now, with the outer shape and slightly lowering the outer guides of the feather design, they’ll be a little more rounded, bulging in the center. This effect has to be very subtle, especially for the longer feathers.
Feather Scatter
Now that we have the guides for one of the wings (we’ll create the other side later), and also the models we’ll use, we need to figure out how to position them.
The method used by feathertemplateinterpolate that best suits us is the “Weights Arrays” method, using array-type attributes with the names and weights of the feather models we want to use.
Creating these arrays manually wouldn’t be a procedural solution, and it takes time and effort to do it correctly.
So, I’ve created a tool: GRM curveFeathersTemplate that will help us with the process in a more user-friendly and visual way:
This tool not only generates the two arrays we’ll use later, but also creates an attribute in the guides that ranges from 0 to 1, which required the guides to be sorted by their @primnum. This attribute, called @uprim, is used to control the weights in the tool itself, but we can also use it later as a mask to control other aspects of the feathers. We can’t see it yet because we need to recreate the guides for the other wing and orient those guides, since their orientation will determine the directions of the feathers.
But thanks to GRM curveFeathersTemplate, the feathers will look something like this in the future:
This tutorial is under continuous development, with more updates coming soon… I’ll keep you posted.