Moov Physics Operator 

Moov Physics is Ornatrix's in-house physics engine for simulating hair motion. The Moov Physics operator gives you a real-time interface to that engine, so you can simulate hair swaying, settling, and reacting to movement directly in the App. It is the operator to reach for when you need true dynamics rather than the faked motion of the Oscillator Operator or Gravity Operator.

 

Simulating hair 

Add the Moov Physics operator to a groom and play the timeline to run the simulation: the hair responds to motion of the underlying object and to forces such as gravity, building up believable follow-through and settling. Because it runs in real time, you can adjust the simulation and immediately see the effect.

 

Collisions 

The simulation collides the hair with meshes. The object the hair grows on is always available as a collider: turn on Collide With Base Mesh in the Collisions group to keep the strands out of it. Any other object in the scene can be added as a collider through the operator's Collision Meshes list: click Add and pick the object, or wire its mesh output into the Collision Meshes port in the Node Graph. Collide With Meshes switches those extra colliders on and off, and removing an object from the list stops it from colliding.

Collisions are tested per strand point, so Particle Radius is the parameter that keeps the hair off a surface: it defaults to 0, and raising it (0.5 or so in a scene modelled in centimeters) makes the strands rest on the surface instead of grazing through it. Collision Tolerance, Friction Coefficient and Restitution Coefficient refine how the contact behaves. Strands with few points can still straddle a surface feature between two of their points, so give simulated guides enough points with the Detail Operator when they need to hug a collider closely.

Turn on Collide With Hair to make the strands collide with each other; Collide With Hair Radius sets how thick they are. Strands resting on other strands are held in place by Hair Friction Coefficient (default 0.3): a strand lying on other hair stays put while the coefficient is larger than the slope it lies on (about 0.47 for 25 degrees, 1 for 45 degrees) and slides otherwise, at any substep count. Raise it for hair that clings, such as styled or product-laden hair, and lower it for silky, slippery hair. Grooms saved with earlier versions keep the older, velocity-only friction between strands; turn on Position Based Hair Friction to use the new one.

A collider is used where its mesh sits in the scene when it was created or imported. Moving it afterwards with the transform tool moves the object in the viewport but not for the simulation.

 

Cohesion and breakable bonds 

Turn on Use Cohesion in the Cohesion group to make strands stick together where they touch, like wet hair. Strand points closer than Cohesion Capture Distance bond and pull together by Cohesion Pull (0 holds them where they met, 1 pulls them all the way). A bond breaks when it stretches past Cohesion Break Distance, or pulls harder than Cohesion Break Force (in vertex weights; 0 never breaks by force) for Cohesion Break Delay frames. Keep the break distance larger than the capture distance so bonds don't flicker. With Cohesion Rebond on, points whose bond broke can bond again after Cohesion Rebond Delay frames. Cohesion Max Bonds limits the bonds per point, and Cohesion Stiffness with its channel and curve sets how strongly they pull. To make strands clump in groups rather than all together, paint a channel with one number per clump, pick it as Cohesion Group Channel, and set Cohesion Group Rule to SameGroup. Points of one strand never bond to each other.

The Group Holder can break too. Set Group Break Force (in vertex weights) or Group Break Strain (a fraction of the bond's length) above 0, and its constraints snap when pulled harder than that for Group Break Delay frames, which makes it work like a hair tie. Broken bonds come back when the simulation restarts from its first frame.

 

Wet hair 

Turn on Use Wetness in the Wet Hair group to simulate wet hair. Wetness goes from 0 (dry) to 1 (soaked), and is multiplied per point by the Wetness Curve from root to tip and by the Wetness Channel, so part of the hair can stay dry. Fully wet points weigh Wet Mass Scale times as much and stretch as much more stiffly, so their own weight does not stretch them further. They bend with Wet Bending Stiffness times their stiffness and lose Wet Drag of their velocity on top of Drag; partly wet points change in proportion. While Use Wetness is on, cohesion only bonds wet hair: bonds pull with Cohesion Stiffness times the wetness, so dry points do not stick and drying hair lets go of its clumps. A Wetness of 0 behaves exactly like dry hair.

 

Stiffness and accuracy 

The stiffness and drag parameters describe the hair's material, and with Time Consistent Stiffness on (the default) they mean the same thing at any frame rate and substep count. Substep Count (default 50) and Iteration Count (default 1) decide how closely the simulation reaches that material: if hair stretches or sags more than expected, raise Substep Count rather than Iteration Count. Augmented Darboux Vector (on by default) keeps tightly curled hair returning to its curls after strong motion; with it off, strongly bent segments can flip and leave kinks. Direct Rod Solve (off by default) solves the stretch and bend constraints of each strand together instead of one at a time, so a single iteration reaches the stiffness values and fewer substeps give the same or better accuracy: 10 substeps are typically more accurate than the default 50, at a fraction of the cost. Collisions still depend on the substep count, so keep at least 10 substeps when strands collide with meshes or with each other. Grooms saved with earlier versions keep the solver settings they were made with.

 

Scriptability 

Moov is extensible through Python. It ships with scripts that provide different simulation behaviors, and technical artists can write their own to achieve more complex or specialized results. See Scripting with the Python Console.

 

Working with simulations 

  • Set the frame range to cover the motion you want to simulate.
  • Set the operator to Live to try changes to its inputs in real time, without simulating from the first frame each time. See Live simulation on the Timeline page.
  • Simulate a sparse set of guides and let the dense hair follow them, which is far faster than simulating every hair. See Adopt External Guides.
  • See what the solver is doing - particles, constraint strain, velocities and collisions - with the Moov Tool.
  • Once you are happy with a simulation, bake it so it plays back without recomputing. See Baking Hair and Guides and Animation Cache Operator.
 

Related 

Missing Something? Let us know if this page needs more information about the topic.