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:
| Value | Effect | Length kept |
|---|---|---|
| 0.0 | No cut | 100% |
| 0.2 | Trim a fifth off (default) | 80% |
| 0.5 | Halve it | 50% |
| 0.8 | Heavy cut | 20% |
| 1.0 | Cut to nothing | 0% |
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
- Set Length to desired amount (e.g., 0.8 for 20% trim)
- Add Variance: 0.1 for natural variation
- Adjust Seed until you like the pattern
- Use Cut Scale curve for shaping if needed
Tapered Cut
- Set Length to 1.0 (no base cut)
- Edit Cut Scale curve:
- Start at 1.0 (root)
- End at 0.7 (tip)
- Creates natural taper toward tips
- Add Variance: 0.05 for subtle variation
Layered Cut
- Use expression:
lerp(0.4, 0.0, v) - Bottom layer keeps 60%, top keeps 100%
- Add Variance: 0.15 for natural layers
- Adjust lerp values for layer intensity
Flyaway Trim
- Use expression:
rand(index) < 0.05 ? 0.7 : 0.0 - 5% of strands lose 70% of their length; the rest are untouched
- Rest untouched
- Adjust threshold (0.05) for more/fewer cuts
Organic Natural Cut
- Use expression:
0.8 + noise(u * 5, v * 5) * 0.2 - Creates organic 80-100% length variation
- No Variance needed (noise provides variation)
- 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