force_table_of_contents #
Adjust Length changes the length of groom curves while preserving their shape. Curves that need to grow are extended from the tip; curves that need to shrink are trimmed. After length adjustment, curves can optionally be aligned toward the skin surface normal and/or straightened. A final resample pass can change the point count to meet segment distance or count requirements.
All controls can be driven per-curve from parameters, curve attributes, or mesh attributes painted on the skin surface.
Adjustments #
Length #
The target length for each curve is computed as:
target = clamp(base_length * scale + offset, minimum, maximum)
Where base_length is the curve’s current arc length.
Each component can be independently enabled or disabled:
| Control | Default | Description |
|---|---|---|
| Set Length | off | Overrides the base length with an explicit value instead of using the curve’s measured arc length. |
| Scale | 1.0 | Multiplier on the base length. Values less than 1 shorten, greater than 1 lengthen. |
| Offset | 0.0 | Added after scale. Positive values lengthen, negative shorten. |
| Minimum | 0.0001 | Floor clamp. Curves will never be shorter than this. |
| Maximum | off | Ceiling clamp. When enabled, curves will never be longer than this. |
Tip Extrapolation #
When a curve grows beyond its original length, new positions must be generated past the tip. Two extrapolation modes are available:
- Linear (default): Extends in a straight line along the tip tangent.
- Polynomial: Continues the tip’s curvature with exponential decay, producing a natural-looking arc that gradually straightens. The Decay parameter controls how quickly the curvature fades.
Attribute Handling During Extension #
When curves are extended, point attributes on the new positions need values. Three modes control this per attribute:
- Interpolate (default): The attribute is stretched to cover the full target length. The original value distribution is remapped proportionally across the new length.
- Extrapolate: The attribute is linearly extended from its last two values. Quaternion attributes extrapolate by repeating the tip’s delta rotation, preserving spin. List attributes in the Extrapolate Attributes field (space-separated).
- Hold: The original distribution is preserved at its original arc positions. Positions beyond the original tip hold the tip value. List attributes in the Hold Attributes field (space-separated).
Redistribute Detail #
By default a length change leaves a curve’s detail (waves, kinks) where it was: a curve that grows keeps its shape and adds a smooth new section past the tip, and a curve that shrinks has its tip trimmed off. Redistribute Detail respreads that detail across the whole new length instead: the curve is split into a low-pass broad shape and the detail riding on it, the broad shape is scaled to the target length, and the detail is remapped onto it. Growing spreads the detail thinner toward the tip; shrinking packs the whole curve’s detail into the shorter length rather than losing the tip. The tip extrapolation mode above still generates any new points; this reshapes the result afterwards.
This engages whenever a curve changes length. It is off by default because it deliberately changes where the detail sits, unlike the shape-preserving default.
| Control | Default | Description |
|---|---|---|
| Redistribute Detail | off | Spread the curve’s detail across the whole new length rather than leaving it packed in the original section, or trimmed off on a shrink. |
| Smoothing Iterations | 24 | Fairing passes used to separate broad shape from detail. More passes treat more of the shape as detail to spread. |
| Strength | 0.4 | Per-pass smoothing strength for that broad/detail split. |
Alignment and Straightening #
These controls modify the curve’s shape after length adjustment.
| Control | Range | Description |
|---|---|---|
| Align to Normal | 0..1 | Blends the root tangent toward the skin surface normal. At 1.0, the curve base points straight out from the surface. |
| Smooth | 0..1 | Strength of an orient-based Laplacian smoothing pass that relaxes high-frequency wiggle while preserving segment lengths exactly. At 0 the curve is untouched. |
| Straighten | 0..1 | Blends each point’s orientation toward a straight line. At 1.0, all curvature is removed. |
Combined at full strength, alignment and straightening produce a straight curve perpendicular to the skin — useful as a starting point for procedural styling.
Smoothing Iterations controls how many relaxation passes the Smooth strength is applied over — more iterations spread the smoothing further along the curve. It defaults to the node parameter, but can be overridden per-curve from a parameter, curve attribute, or mesh attribute like the other controls.
Pin Tip anchors each curve’s tip to its original position. The shape operations (smoothing, straightening, alignment) all keep the root fixed but let the tip drift; with Pin Tip enabled the combined drift is distributed back along the curve so both ends stay put. This slightly alters segment lengths.
Attribute Sources #
Every control above supports three source modes:
Source ||
Description ||
Parameter |
Uses the value set directly on the node. All curves get the same value.
Curve Attribute |
Reads from a named attribute on each curve. When reference curves are connected (Input 2), reads from the reference instead. Checks prim attributes first, then falls back to the root point.
Mesh Attribute |
Samples a named attribute from the rest mesh at each curve’s root position (via skinprim/skinprimuv). Useful for painted maps that vary across the surface.
Set Length from Reference Curves: When Set Length is enabled with source set to Reference Curve Length, the length is measured directly from the corresponding reference curve on Input 2 using its arc length. This requires that the reference curves on Input 2 have matching primitive numbers — each curve on Input 0 reads the length of the reference primitive with the same @primnum. If the reference primitive is missing or has zero length, the curve’s own length is used as a fallback.
Set Length from Chord: When Set Length is enabled with source set to Chord Length, the base length is set to the straight-line distance from the curve’s root to its tip instead of its measured arc length. When reference curves are connected (Input 2), the chord is measured on the matching reference primitive (same @primnum); otherwise it is measured on the curve itself. Scale and offset are then applied to this chord length. This effectively pulls a curved strand toward the length it would have if straightened. Degenerate or missing curves (zero chord) fall back to the curve’s own arc length.
Resampling #
After length adjustment and alignment, an optional resample pass can change the number of points on each curve. This is useful for matching segment density requirements or reducing point counts.
| Control | Default | Description |
|---|---|---|
| Segment Length | off | When enabled, computes the point count from a target distance between points. Shorter distances produce more points. |
| Max Segments | off | When enabled, caps the segment count to a hard upper limit. Applied after segment length computation. |
| Min Segments | 3 | Floor on segment count. Curves will always have at least this many segments regardless of other settings. |
The Minimum Segment Distance control (on the length adjustment) interacts with resampling: if the target length divided by the current segment count would produce segments shorter than this distance, it either reduces the segment count or grows the length to compensate (depending on mode). This minimum is also respected by the resample pass when computing point counts.
If the computed point count equals the original, the resample pass is skipped entirely.
Optional Output Attributes #
By default, Adjust Length only modifies curve positions. Output attributes can be individually enabled and written to configurable names on the original input curves.
| Attribute | Type | Description |
|---|---|---|
| ptdist | point float | Averaged distance to neighboring points (half-segment on each side). |
| segdist | point float | Distance from each point to the previous point (0 at root). |
| tangentu | point vector | Unit tangent direction along the curve. |
| curveu | point float | Arc-length parameterized 0..1 along the final curve. |
| orient | point vector4 | Absolute orientation frame at each point. |
| delta_orient | point vector4 | Relative frame rotation between consecutive points. |
| rest_length | prim float | Final measured arc length of the processed curve. |