Wind and Underwater Hair Simulation with Moov 

In this article, we will use Moov Physics to create a wind and underwater hair simulation.

Ornatrix includes a special Python script for Moov optimized for wind simulations. We will use it to create the following animation:

Wind simulation slow motion

 

Preparing the Groom 

We will start by reducing the groom to its most basic form. The goal is to simulate only what is necessary instead of simulating hundreds of thousands of hair strands, which would take considerably longer and is often unnecessary.

Ideally, we simulate the guides instead of the final dense hair. The movement of the guides can then be transferred to the final strands through Hair from Guides.

It is possible to simulate all strands directly, but viewport performance can suffer significantly. This makes configuring and previewing the simulation much slower.

Another option is to configure the simulation using only the guides, then move the Moov operator above Hair from Guides once the simulation settings are ready. This allows you to work quickly with the guides first and later apply the same setup to all render strands.

For this article, we will simulate only the guides because this is enough for the result we want.

Disable Hair from Guides and the operators above it that depend on the generated dense hair. At this point, add a MoovPhysics operator.

The operator stack now looks like this:

 

Guide Resolution 

This groom contains approximately 1200 guides with 10 vertices per guide.

1200 guides may be more than necessary for this particular groom, but it gives us enough resolution to produce detailed motion while requiring very little interpolation.

At the same time, using only 10 vertices per guide is an optimization. We want to simulate the smallest amount of geometry necessary to get good results, better performance, and faster iteration times.

Above Moov, I have a Detail operator that increases the number of vertices after the simulation. This gives us smoother final curves without increasing the cost of the simulation itself.

 

Loading the Wind Simulation Script 

We are now ready to start the simulation.

Select the Moov operator to display its parameters in the Attribute Editor.

In the Scripts section, load HairSimulatorWind.py into the Python File field.

This file is included with Ornatrix and is normally located in:

C:\Program Files\Ephere\OrnatrixMaya2026\scripts\Moov\HairSimulatorWind.py

The same directory also contains the default Moov script in case you need to restore it later.

After loading the file, a new parameter section called Wind will appear.

Enable Use Wind and press Play on the Maya timeline to run the simulation. You should see the hair moving smoothly with the wind toward the right.

The Wind parameters are simple and allow you to control the wind velocity on each axis, as well as friction and turbulence.

 

Animating the Wind 

The default Wind Velocity X value is 200.

If we increase it to 400, we can immediately see a considerable increase in the wind force toward the right.

To make the simulation more interesting, we can animate Wind Velocity X. For example, changing the value over time using values such as 200, 80, 800, 100 creates sudden changes in wind strength and produces a more dynamic result.

Simulation result without collisions

If you notice the guides stretching during the simulation, enable Limit Stretch.

 

Adding Collisions 

We are still missing collisions. At this point, the guides can pass through the character.

In Moov, go to the Collision Objects section. Use the + button or right-click to add the mesh you want the hair to collide with.
In this example, the collision mesh is a simplified, lower-resolution version of the character with all holes closed.
Using a closed mesh helps avoid collision problems around open borders, where strands may become stuck or pass through the surface.

A lower polygon count also improves simulation performance considerably. Ideally, the collision mesh should only represent the general silhouette and shape needed for the hair collisions. It does not need to reproduce every small detail of the final character. This makes iteration much faster because the simulation has less geometry to process.

 

Collision Settings 

Go to the Collisions section and make sure Collide With Meshes is enabled. It is enabled by default.
In the same section, Particle Radius controls the collision width around each guide or strand vertex.
You can also vary this width along the guide using Particle Radius Curve.

A Particle Radius of 0.6 works well in this case.The correct value depends on the scale of your scene, so try different values until you find one that works for your groom.
This is the result with collisions enabled:

Simulation result with collisions

 

Preserving the Original Hairstyle 

Another thing you may notice is that the simulation can change the original hairstyle considerably.
Ornatrix provides the Attract To Initial Shape option in the Forces and Fields section of Moov to help preserve the original groom.
Enable Attract To Initial Shape and adjust Attract To Initial Shape Stiffness.
The goal should be to find a balance between allowing the hair to react naturally to the simulation and preserving the original hairstyle. A value too high will make the hair too stiff.

 

Experimenting with Gravity and Drag 

In some cases, it can also be useful to disable gravity completely by setting the Gravity parameter to 0.
Reducing or removing gravity can help isolate the effect you are trying to create.
For example, with some adjustments we can create a variation that resembles hair moving underwater.

A possible starting point is:
  • Gravity: 0
  • Drag: 0.2

Experiment with these parameters to create different types of motion.

Simulation with underwater effect

 

Baking the Simulation 

Once we are satisfied with the result, we can bake the simulation to a file that can be reused with the groom.
To bake the simulation, add an Animation Cache operator above Moov and select it to see its properties.
In File Name, use the save button to specify the output file and directory.

 

Record Render Hair 

In the Recording section, enable Record Render Hair when Animation Cache is placed above Hair from Guides or another operator that uses different viewport and render settings. For example, Hair from Guides provides:
  • Render Count — Number of strands used for the final render.
  • Viewport Count Fraction — Percentage of those strands displayed in the viewport.

If Record Render Hair is enabled, Animation Cache records the complete render hair instead of only the reduced viewport representation.

Another example is the Detail operator, which can use different point counts for the viewport and final render.

In our case, we do not need Record Render Hair because Animation Cache is only recording the guides. The Detail operator is above the cache, so its render-specific settings do not affect what we are recording.

 

Recording Range 

The Use Record Time Range option tells Animation Cache to use the animation range configured in Maya's timeline. If disabled, you can manually specify the first and last frame that should be recorded. This option is enabled by default.

For more information about the remaining Animation Cache parameters, see Animation Cache.

 

Recording the Cache 

Finally, press Record Animation and let the recording complete.
Animation Cache records the simulation and automatically loads the resulting file.
You can now disable or remove Moov because the Animation Cache operator contains the recorded simulation.

 

Reusing the Cached Hair 

The resulting file contains more than just the animation. It also stores the guides or strands and their associated data, including Strand IDs and Strand Channels.

You can import this file into a new Maya scene using:

File > Import

Set Files of Type to Ornatrix Alembic and select the recorded file.

When imported into a new scene, Ornatrix creates a groom containing a BakedHair or BakedGuides operator.

You can assign a distribution mesh in the operator properties and continue editing the imported strands or guides using other Ornatrix operators.

However, strands imported this way are static.

To restore the recorded animation, use an Animation Cache operator and load the same cache file into its File Name parameter. The Animation Cache operator will then apply the recorded animation to the baked strands.

 

Files Used 

This tutorial uses the Layered Bob Hairstyle sample groom.

  • Layered Bob Hairstyle Maya project — Contains the Maya scene, groom, textures, and required project files.
  • Simulation Caches — Contains the pre-recorded Ornatrix Alembic animation caches used for the wind simulation examples.

The files can be downloaded from the Layered Bob Hairstyle sample page:
Layered Bob Hairstyle

The sample requires Maya 2026 and Ornatrix 5.2.0.39751 or newer.

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