Generate Strand Data 

The Generate Strand Data operator is a procedural way of creating per-guide or per-vertex strand channel values based on some criteria. These per-guide values can then be used to control parameters and groups inside Ornatrix.

 

Parameters 

 

Data Generation Settings 

 

Strand Group 

Allows you to select a Strand Group created in Edit Guides node which contains the guides from where you want the data to be generated by this node.

 

Random Seed 

Very straight forward: Use this parameter to randomize the way the data is generated.

 

Target Channel 

Similar to Strand Groups, this allows you specify a channel to isolate the area you want the strand data to be generated from.

 

Target Data 

Specifies which part of hair this operator will modify. Aside from creating and changing strand channel data Generate Strand Data operator can also modify other aspects of hair like its width, strand groups, texture coordinates, and more. The available options are:

  • Existing Strand Data Channel
    Strand channel set in Target Channel option will be modified. If this value is set to None then a new channel will be created, this is behavior as designed for backward compatibility.
  • New Strand Data Channel
    This option will create a new channel for the Generate Strand Data node using the name provided in New Channel Name instead of using the default name.
  • Strand Groups
    Strand groups will be modified. It is important to make sure that the target value range is sufficiently high to set groups to an integer value. For example, the default target range of [0,1] will set all groups to 0. However, changing it to [0,100] will set groups to a range between 0 and 100. Values are per-strand.
  • Strand Ids
    Unique per-strand ids will be modified. This is typically not needed but could be useful in some exotic scenarios. Values are per-strand.
  • Widths
    The thickness of individual strands will be modified. Values can be per-strand or per-vertex.
  • Texture Coordinates
    Currently not supported
  • Strand Rotations
    The twist rotations of strands around their stem will be modified. Values are per-strand.
 

New Channel Name 

A blank field to provide a name to the generated channel. If a channel with specified name already exists a number will be appended at the end to make the name unique, for example MyChannel can become MyChannel1. If you are exporting more than one sample per channel then channel for each new sample will have an integer value appended to it. For example, MyColor becomes MyColor1, MyColor2, and MyColor3.

 

New Channel Type 

Here you can choose if the new channel will be generated Per-Strands or Per-Vertex.

 

Sample Value Count 

You can generate or alter more than one consecutive data channel. For example, you may want to generate 3 channels to define an RGB color set or an XYZ object position. Or you may want to generate 2 channels to define a UV set. This parameters specifies how many channels will be generated or altered by this operator. There is no limit, you can go beyond 3 channels if needed.

If you're generating new channels then each new channel will be given a new name with a number suffix. If you're altering existing channels then the channel specified will be the first one to be altered and subsequent channels after it will be altered as well, up to the same value count.

This option is only applicable if target data is either an existing or new data channel, or texture coordinates.

 

Generation Method 

In the drop down list select the type of data to be generated. The following are the options:
  • Constant
    Minimum target value will be assigned to all resulting strands or vertices.
  • Random
    A random value within the minimum and maximum target range will be assigned to each strand or vertex. Each target sample will have a different random value.
  • Index
    Index of the current strand will be assigned to each strand or vertex.
  • Strand Length
    The length of the current strand will be assigned to each strand or vertex.
  • Strand Curviness
    A value between target minimum and maximum range will be set based on how straight or curvy the strand is. The more kinks and turns the strand has the bigger the value will be.
  • Distance To Object
    For each strand or vertex distance to selected scene shape will be calculated and assigned. If a target range is provided the distance will be scaled based on the farthest strand or vertex. See below how to properly use this option.
  • Is Inside Object
    A value of 0 or 1 will be assigned based on whether the strand's root or vertex is inside specified scene shape.
  • World Space Position
    Generates a set of three channels, each containing X, Y, and Z components of world space positions for the strands or vertices.
  • Object Space Position
    Generates a set of three channels, each containing X, Y, and Z components of object space positions for the strands or vertices.
  • Expression
    A custom user expression will be used to assign values to strands or vertices
  • Texture Map
    A source texture map provided through the Texture Multiplier attribute will be used to get the greyscale or RGB values
 

Store Values 

When this option is on the current data output is remembered and always used. Use this to freeze the output of this operator. It will also be saved with the scene. To clear the values simply uncheck this option.

 

Use Source Value Range 

When on, used strand values will be clamped with minimum and maximum values

 

Minimum Source Value 

Any strand values less than this will be clamped to the minimum target value

 

Maximum Source Value 

Any strand values larger than this will be clamped to the maximum target value

 

Use Target Value Range 

When on, the generated values will be rescaled to be in this range, instead of being between 0 and 1

 

Minimum Target Value 

Smallest generated output value

 

Maximum Target Value 

Largest generated output value

 

Texture Multiplier 

When generation method is set to Texture Map or Expression this provides the texture to use for getting source greyscale or RGB values. With expressions texture( u, v, index ) function can be used to get the texture map. Default index is 0.

 

Examples 

 

Generate Strand Data node for shader scattering 

In this example we used the Generate Strand Data node to randomize four shaders on a simple feather setup.

We created four Lambert shaders with different colors, assigned those shaders to the feather object in Mesh From Strands node Mesh From Strands node:

And selected the our Guide Data Channel named "Shader" as scatter channel:

And then used the Generate Strand Data node in "Random" Generation Method to randomize the shaders over the feathers.

In this case, I use the Minimum and Maximum Target Value to change the randomization.

You can download the test scene from here: https://ephere.com:3000/attachments/download/1797/GSDNode.mb

 

Randomizing thickness and other parameters 

In this example we used the Generate Guide Data node to control the thickness, shaders and length of the feathers using one single channel. Then the Minimum Target Value was animated to create this effect:

A sample scene can be downloaded from HERE.

 

Expressions 

One of the ways to generate data is by using SeExpr expressions. Ornatrix provides per-strand or per-vertex contextual expressions which can incorporate other channel data, parameters, texture maps, and other information to produce the target values.

 

Setting Expressions 

To generate strand data using expressions set the Generation Method to* Se Expr* inside the Attribute Editor in the Expression Editor section click Open Expression Editor. The expression dialog will open where you can type in the expressions, preview them, get auto-complete functionality, and use widgets.

NOTE: Expression editor dialog is only available in Maya 2017 and newer. In older versions of Maya a simple textbox for editing expressions is displayed in the Attribute Editor instead.

 

Variables 

The following variables can be used as part of your expressions:
  • $index
    Index of the current strand or vertex. Ranges from 0 to number of strands or vertices.
  • $strandId
    Unique id of the current strand. This value can be an arbitrary unbounded integer.
  • $strandIndex
    Index of the current strand. Unlike index parameter this parameter will always return strand index, even when generating vertex data. Ranges from 0 to number of strands.
  • $point
    Index of current vertex on the strand. For strand data will always be 0. For vertex data will be the point index ranging from 0 to number of points on current strand.
  • $P
    Position of current point in object space. For strand data will be the position of strand's root.
  • $u
    U texture coordinate of the strand or vertex
  • $v
    V texture coordinate of the strand or vertex
  • sc_XXX
    Value present for current strand in per-strand channel named XXX. For example, if you have a per-strand channel named MyChannel you would use sc_MyChannel to get its value
  • vc_XXX
    Value present for current vertex in per-vertex channel named XXX. For example, if you have a per-vertex channel named MyChannel you would use vc_MyChannel to get its value
  • length
    The length value of a hair strand.
  • width
    The width value of a hair strand.
To get a list of all available variables, including the full list of available per-vertex and per-strand data channel variables:
  • Press the Open Editor button in Attribute Editor to open the SeExpr editor.
  • Press List button to open the dialog containing all variables

 

Functions 

The following functions can be used as part of your expressions:
  • texture( u, v, index )
    Samples a value from provided texture multiplier map at specified UV coordinates. index parameter needs to be 0.
 

Expression Examples 

This section provides some basic Ornatrix SeExpr Expression examples that you can use to generate strand channels or strand groups to use in your groom and accomplish a variety of effects.

 

Stray Color 

This example creates a strand channel based on a base value and a percentage of the total hair count. This can be used to add a frizz effect to a certain percentage of hair or use it in the shading network to add stray colors to the hair:

$baseValue=0.0000;#0.0,1.0

$strayValue=1.0000;#0.0,1.0

$percentage=10.0;#0.0,100.0

$result=hash($strandId) <= $percentage/100.0 ? $strayValue:$baseValue;

$result

baseValue
This variable represents the base float value of non affected strands.
strayValue
The float value of the affected strands.
percentage
The amount of affected strands.
result
The resulting data that will be used to generate the channel.
strandId
This is a global variable that holds a unique id for each hair strand.

This expression will also generate some widgets as a user friendly way to tweak those variables:

 

Strand Channels to Strand Groups 

You can repurpose a Strand Channel by converting it into a Stand Group. In this example we take an existing per-strand channel created in Edit Guides and convert it to strand groups, where each float values will result in a new strand group.

To do this, call the name of a per-strand channel in the Expression Editor and set the Target Data to Stand Groups. When you set the Target Data to Strand Groups will allow you to effect the existing strand group data present in the current hair object or to create new strand groups if there is not any yet.

If you call a per-strand channel like in the previous example:

sc_pStrandCH1

Channel pStrandCH will be used to create one or more strand groups:

 

Combining Strand Channels 

Strand Channels are essentially float values painted on guides or strands, so it's easy to work with this data to using basic arithmetic operations.

In this example we take two existing per-strand channels created in Edit Guides and perform several arithmetic operations on them:

To the left we have a channel named pStrandCH1, the right channel pStrandCH2

In order to use strand channels created in Edit Guides inside the Expression Editor we have to call them in using a prefix. To call Per-Strand Channels we use 'sc_' followed by the name of the channel. To call Per-Vertex Channels we use 'vc_' instead.

For this example, the expression:

sc_pStrandCH1 + sc_pStrandCH2

will result in a new channel where both pStrandCH1 and pStrandCH2 are added together:

You can also do multiplication:

 

Adding noise to specified areas using a Strand Channel 

This example creates a Strand Channel and uses it as a mask to add noise on the strands. The noise will be added to the strands painted white. Strands painted black will be ignored.


$strandChannel= sc_CH01;

#Declare local variables to control the noise functions.
$min =1;
$max =0;
$contrast =0.86923;
$freq =27.585; #.1,30

#Calculate Noise.
$strandChannel*smoothstep(noise($P*$freq), $min, $max) -> contrast($contrast)

strandChannel
Holds The Strand Channel used as a mask. This channel was created in Edit Guides.
min
The minimum float value from black to white.
max
The maximum float value from black to white.
contrast
Determines de contrast between the float values.
freq
Determines the frequency of the noise.

 

Selecting between multiple Strand Channels 

This examples creates a slider that allows you to choose between multiple Strand Channels.

#Read the Strand Channels.
$a=sc_CH02;
$b=sc_CH03;
$c=sc_CH04;

#Create variables for channel selection between a range of 1-3.
$select=3;#1,3

#Sets selection range. 
$fit=expand($select,1,3);

#choose() Sets the selection choice based on the range.
choose($fit,$a,$b,$c)
 

Getting Distance To Non-Mesh Objects 

When using the Distance To Object value generation method you may want to select any arbitrary Maya object like a camera, light, or just a point manipulator. However, the list of objects only allows adding meshes. To work around this the following can be done:
  1. Create a new plane or a sphere mesh and set its radius/size to be very small. A value of 0.001 will do.
  2. Parent this created mesh shape under the desired object's transform.
  3. Select the created mesh shape in Generate Strand Data operator's Attribute Editor parameters
Missing Something? Let us know if this page needs more information about the topic.