Skip to content
Voro
  1. Geometry
  2. Solvers

Strand

Strand simulates hair, ropes and fibers with stretch and bend constraints. Roots can follow transforms, a velocity field can move the strands, and contact settings control collisions. Groom rules shape the displayed result; Rest rules change the shape the simulation tries to hold.

Place Strand in the Geometry view, under Solvers. Connect a small set of root points to geometry. Input normals provide the growth direction; Grow Dir supplies it when N is absent. Start with 16 Points Per Strand and Strand Length at 1.2.

On Resources, add a velocity Connection and choose Force Field’s velocity resource. Drag Coupling starts at 3. Use modest wind while checking the roots and floor. Add an sdf resource for an obstacle, and xforms when roots need to follow a transform set.

Outputs include P, v, Cd and id, a line output with strand topology, and an optional contact set. Use the line output downstream when you need the strand connections rather than isolated points.

Connections accepts sdf, velocity, xforms and contacts. Publish Contact Set starts off. Enable it if another solver needs Strand’s contacts, then connect that resource on the receiver.

  • Simulate pauses advancement; Reset restores the starting strands. Points Per Strand and pool limits affect the build. Auto-Rebuild applies those edits, or Rebuild commits them when automatic rebuilding is off.
  • Length and Length Jitter set the starting variation. Root Offset moves the live anchors.
  • Substeps starts at 4 and Constraint Iterations at 12. Bend Stiffness resists folding; Max Stretch limits strain. Damping and Max Velocity control motion.
  • Groom Rule Stack applies clump, curl, frizz, lean and wave offsets after the solve. These display changes do not feed back into collision physics.
  • Rest Shape Stack bakes the same shaping vocabulary into the rest shape on rebuild. Raise Shape Stiffness from 0 when you want the strands to hold that shape. Twist Rate controls twist along the strand.
  • Self Collision starts on and changes require a rebuild. Contact Radius, Friction and Damping tune strand contacts. Contact Stride reduces the density of published contacts.

Max Strands and Max Points/Strand reserve the pools; Points Per Strand selects the active length of each chain. Increase counts after checking a sparse groom.

A strong display Groom offset can move the visible strand away from its simulated collision position. Use Rest rules for a shape that should participate in the solve.

Inputs

  • geometry points
  • sdf sdf collider
  • velocity velocity field
  • xforms transforms
  • contacts contacts

Outputs

  • P points
  • v points
  • Cd points
  • id points
  • contact contacts
  • line lines

Strand

Auto-Rebuild on Build Params (Autorebuild) Toggle op('strand').par.Autorebuild
Default:
On
Options:
Off, On
Rebuild (Rebuildnow) Pulse op('strand').par.Rebuildnow
Default:
None
Simulate (Simulate) Toggle op('strand').par.Simulate
Default:
On
Options:
Off, On
Reset (Resetsolver) Pulse op('strand').par.Resetsolver
Default:
None
Groom (Hdrgroom) Str op('strand').par.Hdrgroom

Read only.

Default:
"" (Empty String)
Max Strands (pool) (Maxstrands) Int op('strand').par.Maxstrands
Default:
16384
Range:
64 to 131072
Max Points/Strand (pool) (Maxpoints) Int op('strand').par.Maxpoints
Default:
32
Range:
2 to 256
Points Per Strand (Pointsperstrand) Int op('strand').par.Pointsperstrand
Default:
16
Range:
2 to 256
Strand Length (Length) Float op('strand').par.Length
Default:
1.2
Range:
0.01 to 8
Length Jitter (Lengthjitter) Float op('strand').par.Lengthjitter
Default:
0.15
Range:
0 to 1

Roots

Roots (from input geo + N) (Hdrroots) Str op('strand').par.Hdrroots

Read only.

Default:
"" (Empty String)
Grow Dir (fallback when input has no N) (Growdirx) Float op('strand').par.Growdirx
Default:
0
Grow Dir (fallback when input has no N) Y (Growdiry) Float op('strand').par.Growdiry
Default:
-1
Grow Dir (fallback when input has no N) Z (Growdirz) Float op('strand').par.Growdirz
Default:
0
Root Offset (live anchor) (Rootoffsetx) Float op('strand').par.Rootoffsetx
Default:
0
Root Offset (live anchor) Y (Rootoffsety) Float op('strand').par.Rootoffsety
Default:
0
Root Offset (live anchor) Z (Rootoffsetz) Float op('strand').par.Rootoffsetz
Default:
0
Per-root attrs: mass/stiffness/length/twist/pscale/Cd/N (Hdrattrs) Str op('strand').par.Hdrattrs

Read only.

Default:
"" (Empty String)

Solver

Dt (Dt) Float op('strand').par.Dt
Default:
0.0166667
Range:
0.0001 to 0.5
Substeps (Substeps) Int op('strand').par.Substeps
Default:
4
Range:
1 to 16
Constraint Iterations (Iterations) Int op('strand').par.Iterations
Default:
12
Range:
1 to 64

Forces

Forces (Hdrforces) Str op('strand').par.Hdrforces

Read only.

Default:
"" (Empty String)
Gravity (Gravityx) Float op('strand').par.Gravityx
Default:
0
Gravity Y (Gravityy) Float op('strand').par.Gravityy
Default:
-9.81
Gravity Z (Gravityz) Float op('strand').par.Gravityz
Default:
0
Damping (Damping) Float op('strand').par.Damping
Default:
0.985
Range:
0 to 1
Max Velocity (Maxvelocity) Float op('strand').par.Maxvelocity
Default:
20
Range:
0.1 to 100
Drag Coupling (vel: field) (Dragcoupling) Float op('strand').par.Dragcoupling
Default:
3
Range:
0 to 1000

Collision

Constraints & Collision (Hdrcoll) Str op('strand').par.Hdrcoll

Read only.

Default:
"" (Empty String)
Max Stretch (strain limit) (Maxstretch) Float op('strand').par.Maxstretch
Default:
0.1
Range:
0.01 to 1
Bend Stiffness (Bendstiffness) Float op('strand').par.Bendstiffness
Default:
0.35
Range:
0 to 1
Collision Radius (SDF/floor) (Collisionradius) Float op('strand').par.Collisionradius
Default:
0.02
Range:
0.001 to 0.5
Moving Boundary Slip (Boundaryslip) Float op('strand').par.Boundaryslip
Default:
0
Range:
0 to 1
Floor Enabled (Floorenabled) Toggle op('strand').par.Floorenabled
Default:
On
Options:
Off, On
Floor Y (Floory) Float op('strand').par.Floory
Default:
-1.5
Range:
-10 to 10
Strand-Strand Contact (Hdrself) Str op('strand').par.Hdrself

Read only.

Default:
"" (Empty String)
Self Collision (rebuilds) (Selfcollision) Toggle op('strand').par.Selfcollision
Default:
On
Options:
Off, On
Contact Radius (Contactradius) Float op('strand').par.Contactradius
Default:
0.02
Range:
0.001 to 0.5
Contact Stiffness (Contactstiffness) Float op('strand').par.Contactstiffness
Default:
0.5
Range:
0 to 1
Contact Friction (Contactfriction) Float op('strand').par.Contactfriction
Default:
0.1
Range:
0 to 1
Contact Damping (1=inelastic) (Contactdamping) Float op('strand').par.Contactdamping
Default:
1
Range:
0 to 1

Coupling

Coupling (Hdrcouple) Str op('strand').par.Hdrcouple

Read only.

Default:
"" (Empty String)
Publish Contact Set (Publishcontacts) Toggle op('strand').par.Publishcontacts
Default:
Off
Options:
Off, On
Couple Weight (Coupleweight) Float op('strand').par.Coupleweight
Default:
1
Range:
0 to 2
Max Foreign Contacts (cap) (Maxforeign) Int op('strand').par.Maxforeign
Default:
65536
Range:
1024 to 4000000
Contact Stride (Contactstride) Int op('strand').par.Contactstride
Default:
4
Range:
1 to 64

Shape

Shape (LRA + local shape + twist) (Hdrshape) Str op('strand').par.Hdrshape

Read only.

Default:
"" (Empty String)
Shape Stiffness (hold rest shape) (Shapestiffness) Float op('strand').par.Shapestiffness
Default:
0
Range:
0 to 1
Twist Rate (rad / unit length) (Twistrate) Float op('strand').par.Twistrate
Default:
0
Range:
-25 to 25

Color

Color (Hdrcolor) Str op('strand').par.Hdrcolor

Read only.

Default:
"" (Empty String)
Base Hue (Basehue) Float op('strand').par.Basehue
Default:
0.08
Range:
0 to 1
Hue Spread (per-strand) (Huespread) Float op('strand').par.Huespread
Default:
0.12
Range:
0 to 1

Rules

Groom Rules (Hdrrules) Str op('strand').par.Hdrrules

Read only.

Default:
"" (Empty String)
Groom Rule Stack (display) (Groomrules) Str op('strand').par.Groomrules
Default:
"" (Empty String)
Rest Shape Stack (baked, rebuilds) (Restrules) Str op('strand').par.Restrules
Default:
"" (Empty String)