Animation Hair and Cloth Physics Bounces

One common problem with animating characters is when you instantly cut from one pose to another for characters with physics on hair or cloth. Physics engines often interpret the change of position as high velocity movement, causing more extreme hair and cloth bounces.

The short animation in the tweet below is cool, but clearly shows the hair and dress bouncing as a result of quick cuts to new positions. (Look at the hair and clothes when the pose suddenly jumps to a new pose – the hair and dress reacts.)

Physics Engines

Why does this happen? Physics engines generally work by looking at the position of bones before and after a frame of animation. The physics engine introduces some lag and over-shoot in the movement of physics controlled bones compared to their root, with damping eventually stopping any movement.

Consider a strand of hair. Normally a few bones are put in the hair in a chain. There is a “natural” position for the hair bones to want to return to. If you move the root of the hair strand, the other bones in the chain don’t move immediately in sync. They have a bit of lag initially as they start slower and then try to catch up with the new root position, they have a bit of overshoot as the bone goes past where it should end up, and there is damping so if the hair root stays still, then hair will eventually stop oscillating either side of the desired final resting place.

There are other effects that can be added such as gravity pulling the bones directly downwards, wind that cause cause the bones to move even when the root is not moving, and stiffness that avoids bones flexing too much.

So, cutting to a new pose or position instantaneously can cause whiplash as the physics engine considers the change as a very high velocity action, which it then tries to apply to the hair/cloth bones. The strength of damping determines how long the bouncing of the hair/cloth will occur.

How to Avoid

While bounces can be avoided in the middle of an animation by using smoother transitions between poses, there are times they are hard to avoid.

At the start of an animation clip. The character will jump from their default pose to the pose at start of the animation clip. I usually address this when using a Unity Timeline with a recorder track by inserting a delay of a second or two before the recorder starts. This gives the physics damping a chance to settle down before recording any output. This can be problematic for cutscenes however.

During a cutscene that jumps to a new location. A cutscene might have a character jump to a new location half way through. This is similar to starting a new animation clip, but there is some animation immediately beforehand. Inserting a delay in the middle of a cutscene is generally not acceptable. One approach to overcome this problem is to have multiple copies of the character in different locations, ready to go. So jumping to a new location already has a different copy of the character already in place, ready to go. That is, the camera jumps to a new location, the character does not.

Avoid runtime physics. Another approach to fix the situation is of course not to have hair or cloth bone physics to do bouncy effects, or create animation clips for bounce effects rather than relying on the physics engine at runtime to perform physics actions.

Conclusion

Physics for hair and cloth do add depth to characters so I am planning to keep using them. For my use case of motion webcomics, I can start an animation clip (such as an idle loop) before the recorder track starts recording, allowing the physics engine time to settle down bouncing of hair or cloth. But if you want to create a cutscene where there are no gaps in the scene, this can be problematic.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s