Cut Modifier

The Cut modifier trims hair strands to create length variation and shape. It's perfect for creating haircuts, trimming flyaways, and adding natural length variation to your groom.

What It Does

The Cut modifier controls strand length by:

  • Trimming strands to a target length
  • Adding variation for natural randomness
  • Using profile curves for shaped cuts
  • Supporting expressions for procedural control

Think of it as a virtual haircut tool that can create everything from subtle trims to dramatic length changes.

Core Parameters

Length (Cut Amount)

IMPORTANT: The Length parameter controls how much length to KEEP (not remove):

  • 1.0 = Keep 100% (no cut)
  • 0.8 = Keep 80% (cut 20%)
  • 0.5 = Keep 50% (cut half)
  • 0.0 = Remove entirely

This matches XGen's behavior and makes expressions more intuitive.

Range: 0.0-1.0, default 1.0

Examples:

  • 0.95 = Slight trim (keep 95%)
  • 0.7 = Moderate cut (keep 70%)
  • 0.5 = Cut in half

Cut Scale (Profile Curve)

The profile curve controls how the cut varies along the strand length:

  • Flat at 1.0 = Uniform cut (default)
  • Ramp down = Taper toward tips
  • Ramp up = Shorter at roots, longer at tips
  • Custom shapes = Create specific cut patterns

The curve is evaluated from root (left) to tip (right).

Default: Flat line at 1.0 (no variation)

Variance

Random variation in cut length per strand:

  • 0.0 = All strands cut to same length
  • 0.5 = Moderate variation
  • 1.0 = Maximum variation

Range: 0.0-1.0, default 0.0

Higher variance creates more natural, less uniform cuts.

Seed

Random seed for variance:

  • Range: 0-100, default 0
  • Change to get different random patterns
  • Same seed = same result (repeatable)

FollicleScript Examples

Basic Random Trim

Slight Random Trim (Keep 80-100%):

rand3(0.8, 1.0, index)

Each strand keeps between 80-100% of its length.

Moderate Variation (Keep 70-95%):

rand3(0.7, 0.95, index)

More noticeable length variation.

XGen-Style "Remove X%"

Remove 1-3% from Each Strand:

1.0 - rand3(0.01, 0.03, index)

Keeps 97-99% of length (subtle trim).

Remove 2-5%:

1.0 - rand3(0.02, 0.05, index)

Keeps 95-98% of length.

Remove 10-20%:

1.0 - rand3(0.10, 0.20, index)

Keeps 80-90% of length (noticeable cut).

UV-Based Length Variation

Shorter at Bottom, Full at Top:

lerp(0.7, 1.0, v)

Bottom strands keep 70%, top strands keep 100%.

Shorter on Left, Full on Right:

lerp(0.6, 1.0, u)

Creates a diagonal cut pattern.

Gradient with Offset:

0.8 + v * 0.2

80% at bottom, 100% at top.

Center vs Edge

Shorter in Center, Longer at Edges:

0.7 + abs(u - 0.5) * 0.6

Center keeps 70%, edges keep 100%.

Longer in Center, Shorter at Edges:

1.0 - abs(u - 0.5) * 0.4

Center keeps 100%, edges keep 80%.

Per-Clump Variation

Each Clump Different Length:

rand3(0.75, 1.0, clump_id)

Each clump has consistent length, but clumps vary.

Clump-Based with Offset:

0.8 + rand(clump_id) * 0.2

Clumps vary between 80-100%.

Conditional Cuts

Top Half Full, Bottom Half Trimmed:

v > 0.5 ? 1.0 : 0.7

Top keeps 100%, bottom keeps 70%.

Random 10% Get Heavy Cut:

rand(index) < 0.1 ? 0.5 : 1.0

10% of strands cut to 50%, rest untouched.

First 100 Strands Shorter:

index < 100 ? 0.8 : 1.0

Useful for testing or specific effects.

Noise-Based Organic Variation

Organic Length Pattern:

0.7 + noise(u * 5, v * 5) * 0.3

Creates natural-looking length variation (70-100%).

World-Space Noise:

0.8 + noise(x, y) * 0.2

Length varies based on world position (80-100%).

Multi-Octave Noise:

0.7 + noise(u * 3, v * 3) * 0.2 + noise(u * 10, v * 10) * 0.1

Combines large and small scale variation.

Common Workflows

Basic Haircut

  1. Set Length to desired amount (e.g., 0.8 for 20% trim)
  2. Add Variance: 0.1 for natural variation
  3. Adjust Seed until you like the pattern
  4. Use Cut Scale curve for shaping if needed

Tapered Cut

  1. Set Length to 1.0 (no base cut)
  2. Edit Cut Scale curve:
  • Start at 1.0 (root)
  • End at 0.7 (tip)
  1. Creates natural taper toward tips
  2. Add Variance: 0.05 for subtle variation

Layered Cut

  1. Use expression: lerp(0.6, 1.0, v)
  2. Bottom layer keeps 60%, top keeps 100%
  3. Add Variance: 0.15 for natural layers
  4. Adjust lerp values for layer intensity

Flyaway Trim

  1. Use expression: rand(index) < 0.05 ? 0.3 : 1.0
  2. 5% of strands cut to 30% (short flyaways removed)
  3. Rest untouched
  4. Adjust threshold (0.05) for more/fewer cuts

Organic Natural Cut

  1. Use expression: 0.8 + noise(u * 5, v * 5) * 0.2
  2. Creates organic 80-100% length variation
  3. No Variance needed (noise provides variation)
  4. Adjust noise frequency (5) for pattern scale

Cut Scale Curve Tips

Uniform Cut:

  • Flat line at 1.0
  • All strands cut equally
  • Use with Variance for randomness

Taper to Tips:

  • Start: 1.0 (root)
  • End: 0.5 (tip)
  • Creates natural taper

Bulge in Middle:

  • Start: 0.8
  • Middle: 1.0
  • End: 0.8
  • Longer in middle, shorter at ends

Sharp Cutoff:

  • Flat at 1.0 until 80%
  • Drop to 0.0 at 80%
  • Creates hard edge

Combining with Other Modifiers

Cut + Clumping:

  • Apply Cut after Clumping
  • Maintains clump structure
  • Trims clumped hair naturally

Cut + Frizz:

  • Apply Cut before Frizz
  • Frizz adds detail to cut edges
  • Creates natural, textured ends

Cut + Coil:

  • Apply Cut after Coil
  • Trims coiled hair
  • Maintains curl pattern

Common Issues

Cut Too Uniform

  • Increase Variance
  • Use expression with rand()
  • Add noise-based variation

Cut Too Extreme

  • Check Length value (remember: 1.0 = no cut)
  • Verify expression returns 0.0-1.0 range
  • Use clamp() in expressions

Some Strands Disappear

  • Length too low (below 0.1)
  • Expression returning 0.0
  • Check minimum length in expression

Cut Doesn't Match Preview

  • Regenerate strands
  • Check Cut Scale curve
  • Verify expression is valid

Technical Notes

  • Cut is applied after all deformation modifiers
  • Length parameter is a multiplier (1.0 = original length)
  • Cut Scale curve is evaluated per strand segment
  • Expressions are GPU-evaluated for performance
  • Variance uses deterministic random (repeatable)
  • Minimum practical length is ~0.1 (10%)

Performance Tips

  • Cut modifier is very fast (simple length multiplication)
  • Expressions add minimal overhead
  • Complex noise patterns may be slower
  • Use simple expressions when possible

---

Next: Simulate Modifier - Add physics to your hair Previous: Loc Modifier