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)

The Length parameter is the fraction of length to REMOVE. Measured against the engine:

ValueEffectLength kept
0.0No cut100%
0.2Trim a fifth off (default)80%
0.5Halve it50%
0.8Heavy cut20%
1.0Cut to nothing0%

Range: 0.0–1.0, default 0.2

This page previously stated the opposite — that Length was how much to KEEP, with a default of 1.0. It is the reverse, and the expression examples below have been corrected to match. If you built a groom against the old description, its cuts were inverted.

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

Every expression here returns the fraction to remove. Small numbers are gentle; large numbers take most of the hair off.

Slight random trim (keeps 80–100%):

rand3(0.0, 0.2, index)

Each strand loses between 0 and 20% of its length.

Moderate variation (keeps 70–95%):

rand3(0.05, 0.3, index)

More noticeable length variation.

"Remove X%" Style

Because Length is the fraction removed, these are direct — no 1.0 - inversion. The old examples on this page wrapped everything in 1.0 - ..., which under the real semantics removed 95–99% of the hair rather than 1–5%.

Remove 1–3% from each strand:

rand3(0.01, 0.03, index)

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

Remove 2–5%:

rand3(0.02, 0.05, index)

Keeps 95–98% of length.

Remove 10–20%:

rand3(0.10, 0.20, index)

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

UV-Based Length Variation

Shorter at bottom, full at top:

0.4 - v * 0.4

Removes 40% at the bottom, nothing at the top.

Diagonal:

lerp(0.4, 0.0, u)

Creates a diagonal cut pattern.

Center vs Edge

Shorter in the centre, longer at the edges:

0.3 - abs(u - 0.5) * 0.6

Centre loses 30%, edges are untouched.

Longer in the centre, shorter at the edges:

abs(u - 0.5) * 0.4

Centre untouched, edges lose 20%.

Per-Clump Variation

Each clump a different length:

rand3(0.0, 0.25, clump_id)

Each clump is internally consistent, but clumps differ — keeping 75–100%.

Clump-based with an offset:

0.05 + rand(clump_id) * 0.15

Clumps lose between 5 and 20%.

Conditional Cuts

Top half full, bottom half trimmed:

v > 0.5 ? 0.0 : 0.3

Top untouched, bottom loses 30%.

A random 10% get a heavy cut:

rand(index) < 0.1 ? 0.5 : 0.0

A tenth of the strands are halved; the rest are untouched.

First 100 strands shorter:

index < 100 ? 0.2 : 0.0

Useful for testing or specific effects.

Noise-Based Organic Variation

Organic length pattern:

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

Natural-looking variation, keeping 70–100%.

World-space noise:

noise(x, y) * 0.2

Length varies with world position, keeping 80–100%.

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.4, 0.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.7 : 0.0
  2. 5% of strands lose 70% of their length; the rest are untouched
  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 the Length value (remember: 0.0 = no cut, 1.0 = cut to nothing)
  • 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

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