Tutorial for styling tiny layers of hairs, mainly using "Follow NURBS" modifier.
Geometries
First of all, create a high resolution copy of your model. It will be used many times later as target object for shrink wrap operator. It's good idea to make it smooth as possible, without ears or internal surfaces. It needs to match base model in areas where hair is growing. We call it: "collider".
Now, MURBS emitter. It should match to collider as close as possible.
It's good idea to create NURBS emitter from loft, shrink-wrapped to collision object. In this way, you can use only a few curves, and tweak your surface interactively.
Finally, we will create a null for driving transforms of hair rig - we call it "transform null".
Point Cloud
Go to Model > Get > Primitive > Point Cloud > Empty. Create ICE tree on point cloud. Just ICE tree, what means, un simulated UCE tree."Emit Guides" compound is there only to provide basic strand creation, also for testing purposes.
In compound, set strand segments to about 30, emission type to grid, Count In U to 30.
Count of strand segments is a very important for modeling performance. When modeling, keep it low as possible.
Follow NURBS modifier
Now, first "Follow NURBS" modifier. It's designed mainly for creating a tiny layers of hair along body, which is very hard to create in another ways. It acts as an opposite to "Cross Section" modifiers. Follow NURBS forces strands to follow NURBS surface, Cross Section modifiers creates positions for lofting hair. Let's see how Follow NURBS works:
It starting from first U row of NURBS surface. Point positions (hair roots) are projected to NURBS surface, then hairs are automatically aligned in layers. You can specify area where hairs "grow". If hair roots are outside of cutoff distance in SI units, or outside of "U limit" area on NURBS surface, modifier won't catch hairs.
As usually, keep Cutoff Distance as low as it possible - increase cutoff value until dissapears the all original strand shapes.

"Splitting Offset" is for correct creation of hair groups - we'll take a look to this option later.
A lot of operators here, rely on correct UV's layout on NURBS surfaces. To see first U and V rows, go to main menu>display> visibility options> attributes, enable Nurbs Boundaries.

For adjusting NURBS UV's, go to Model> Modify> Surf.Mesh> Swap UV. If UV doesn't fit at first, repeat Swap UV operator.

ICE allows replacing geometry inputs at any time. So, if some geometry doesn't look nice at first, don't worry, you can change it later. Also, anything you create, it can be re-used later for another hair rig.

It's good idea to use "common" rule for units, 1 SI unit = 10 cm, because of default distance cutoffs for geometry queries.

With ICE, you can copy/paste ICE trees between different scenes. Exactly, you can open another scene, copy ICE compounds, close that scene and open new one, then paste compounds in desired ICE tree.
When using more than one Follow NURBS modifier, the last one takes precedence.
NURBS surface for Follow NURBS modifier... after a lot of tweaking, it looking like this.
After you tweak points on NURBS surface, you may notice that UV isn't "uniform" anymore. That is especially visible when applying Curls. To fix that, go to Model > Modify > Surf.Mesh > Reparametrize. For these compounds, probably the best reparametrization is along Chord Length.

Sometimes, NURBS surfaces in Softimage can be "broken", they just don't react properly to ICE point locators, also to shrink wrap operator. From my experience, this can happen when merging or snipping surfaces. Lofting seems to be always OK. To test NURBS surface, shrink wrap another object to it - it should catch along whole surface correctly. Here I've used Softimage for everything, anyway, imported NURBS from another application may be nice too.

For re-lofting NURBS surface, you can use this JAVA script. Paste the code into script editor, select NURBS surface, run script. It will extract all V curves, so you can get a new, 'clean' NURBS surface by lofting. Code:

var sObj = selection(0);
ApplyGenOp("CrvExtract", "", sObj+".knotcrvv[*]", 3, siPersistentOperation, siKeepGenOpInputs, null);
 
For extra control over NURBS surface 'density', you can create ICE tree on NURBS surface, connect 'NURBS UV Density' compound, then tweak U and V density with function curves.
We added second modifier. We also added 'Point Color' compound.
Curls
"Curls" compound is enough self explanatory, I think. For convenience reasons, Curls, Randomize, Static Turbulence..., and some other compounds, have built in function curve for modulating weight along strands.

You can modulate al lot of other scalar parameters along strand length, by using "f" compounds: Strand fCurve, Strand fExponent, Strand fSmooth Step.
Just connect these compounds into scalar inputs.
Grouping, Clumps, Locks
Let's go back to see what doing "Grouping" compound. First, it sorts all points by following some criteria, then it does searching for strand positions from chosen points, . First sorting is by UV's of emitter, but every Follow NURBS modifier is able to add it's "Splitting Offset", actually, at searching stage, points are moved by splitting offset- so groups are distributed along modifiers. You can enable display at searching stage, to see how the grouping compound sorts the points.

"Clump" is interpolation with chosen strand. When it's at full weight, you can notice just one strand instead of many in a group.

Here, "Lock" means the interpolation with chosen strand, according to the distance between points at hair roots. It looks like an 'extrusion' along guide. Hair is grouped in strips, with constant width along whole length of hair.

Lock by distance is performed automatically, along strands. It is median cut, it will enable locks, considering distance between guides, when this distance is higher than provided values. For example, you can use this, for proper interpolation around shoulders - even NURBS surface penetrates into the model.

That is how it looks like after 'Grouping" compound. We also added a "Strand Length" compound at the end of ICE tree, with "constant length" enabled.
For Grouping compound, it's good idea to apply this one AFTER deformation modifiers, such as Curls, Randomize, Turbulence...
For all these compounds, "length" or "fill" means a preservation of strand shapes, Strand Length compound will just cut the strands.
Second Point Cloud
 
In many cases, we can live without this one. For final look, it's enough to increase emission rate in Strand Sample Set compound.
Anyway, there are at least two reasons for second point cloud:

- performance: it's faster to do all modifications on low-resolution point cloud, then just to interpolate everything on another point cloud.
- performance during simulation: obviously, it's much faster to simulate and cache just the low-resolution point cloud.

So, create a new, empty point cloud, create un simulated ICE tree, add "Emit Hair" compound, connect NURBS emitter. Connect the first, "guides" point cloud.
Your initial hair ICE tree may look like this. Even it's a new point cloud, it can't exists without first one. Take look at parameters:


Strand Size and Point Size parameters in "Emit Hair" compound:
Strand size is rendering size, if you want variable size along strand, plug "Strand FCurve" compound there.
Point Size: has effect only in view port.

Clump and Lock parameters creates the same effect as in "Grouping" compound, but this time, strands of first point cloud are used as guides. This is mostly for better performance, there is no need for additional geometry queries, all data is already present.

'Align Locks' will do proper alignment along guides, but it's slower.

When both Clump and Locks are at zero, hairs are interpolated evenly, between three guides. This is default.

Split by UV Offset: Enables slpitting, created by modifiers on guides point cloud.
 
Splitting...
Similar to Grouping Compound, Emit Hair will try to split hairs, according to emitter's UV layout. Compound is searching for three closest guides. Every Follow NURBS modifier is able to virtually move UV layout by some distance (that is: "Splitting Offset"), so you can expect a proper splitting between modifiers too. In image, I've used Follow Nurbs together with Cross Sections.

Sometimes, setting the splitting offset only by modifiers isn't enough, for example, between starting rows of modifier's itself. For these cases, there is 'Splitting Offset' compound. It takes UV values from NURBS emitter, or UV values created by modifiers, or any scalar value connected to 'Add' port - for example, weight map.
'Additive' with this compound means considering offset values, created before. Otherwise, compound will overwrite these values.
Here's an example, how to create variable hair width for rendering - that's the all what you need to do, there is no need to call anything in render tree. If you're using single point cloud, plug Strand fCurve compound into the Strand Size parameter of "Strands Sample Set" compound.
... and another example, how to get variable density of hairs, by adjusting emitters's UV. You can do that interactively.
Of course, it's also possible to delete some points, using weight map on emitter.
Example, how to create specular 'dots' along hairs. Actually you can create them without ICE assistance, but 'Random Scalar Attribute' compound is here to provide two important values: random value for each strand, also it's able to normalize that value, according to strand length. You can spare a few nodes in render tree by using BA Scalar Modulus shader from Binary Alchemy Collection.
Details again...
We want only a few hairs to go in different way. We'll use "Randomize" compound. It using a standard ICE Random Value node. For using it only on a few strands, there is "every nth" parameter.
"Every Nth" is exactly the same as factory "Every Nth Particle" compound, parameter is included here only for convenience.
Rendering, transforms
By default, "Emit Hair" compounds will set particle type to segment, which means hair primitive, exactly the same as for standard Softimage hair.
At the end, we may get something like that.

For transformations, everything that's involved in hair creation need to move too, except...
... point clouds itself. Even nothing may happen when you move them, just leave them at world zero transform, all the time.

For all other details, take look at support files within tutorial.
 
Best Regards,
Anto Matkovic
December 2009
anto@matkovic.com