force_table_of_contents #
This node captures nearby sparse guides and deforms a set of dense curves.
See hair_deform for more information.
The result will update the input Deformed Curves at render time, so material bindings will stay attached.
The Guide prims will be set to guide purpose.
Guide and Skin prims must have a primvars:rest primvar.
Due to the way husk procedurals are invoked, none of the inputs may be proxy purpose.
Differences from the SOP #
This node is not exactly like the SOP equivalent in the following ways:
- Uncaptured curves will simply be removed.
- The SOP node takes six inputs, but this only requires three, with the guides and the mesh requiring a
primvars:restprimvar in order to function. - Instancer points are point instancers chosen with Point Instancers rather than a points input, and are written back onto those instancers.
- The result of the procedural cannot be seen until rendered through husk or previewed with houdinipreviewprocedurals.
- Deformation cannot be disabled via a parameter. If you want to disable it, bypass or remove the node.
- Output attributes, like captured
guidesandweights, are not exported. - Debug mode is not available. It can be useful to set up a Sop hair_deform with channel references to trouble-shoot, since they use the same capture and deformation logic.
Point Instancers #
Point instancers listed in Point Instancers are carried along with the groom by the same procedural, the way hair_deform carries its instancer points: each instance binds to its nearest strand at rest and follows that strand’s position and orientation. At render time the procedural replaces the instancer’s positions and orientationsf, and with Transfer Guide Velocity on also its velocities, accelerations and angularVelocities, so instances blur and spin with the hair; prototypes, scales, ids and everything else are left as they are. The skin’s own turning at each root is included in angularVelocities; see Skin Rotation on hair_deform, which works the same way here.
The rest pose comes from two primvars on the instancer: primvars:rest (positions) and primvars:restorient (orientations, as float4 x, y, z, w). When they are missing, this node authors them from the instancer’s current positions and orientations, so normally there is nothing to set up. Author them yourself if the instancer’s own arrays are not at rest.
Instancer positions are read and written in the instancer’s own space, which must match the space of the curves.
The curves and the instancers come out of the procedural as one geometry, so they share point attributes. The curves gain unused positions, orientationsf and (with velocity) angularVelocities attributes, and an instancer gains any of the curves’ point attributes it does not already have as primvars at their default values (for example displayColor from Cd). The instancer’s own primvars are written back unchanged, and its extent is replaced by the bounds of the instance positions.
Workflow #
The general workflow for working with this procedural will largely match the SOP, with some potential differences:
- It is crucial that both the mesh and guides have a
primvars:restprimvar. - It may be useful to use a hair_deform in capture-only mode to capture guides in an environment where debugging is easier to do.