## Soft Effector

30 May 2009 24,291 views 6 Comments

### Description

When an IK chain extends towards its full length, it will tend to snap into it’s final position. To prevent this from happening, it is possible to give the appearance that the IK chain is stiffening as it extends towards it’s full length. This technique isn’t new and similar functionality is already implemented in Cinema 4D.

In XSI, we need a way of allowing the chain to gradually fall behind the position of the effector. This stops the effector from snapping the chain into the final position, and gives rise to a much more natural motion (as seen below).

Note: If you are unable to view the GIF animation, you may need to change settings in your Firewall. For example, in Zone Alarm, you need to disable Privacy->Ad Blocking

The snap effect visible in the top chain isn’t due to some inaccuracy in the IK calculation, but is just down to a simple geometrical effect. It can be shown mathematically (see diagram below) that as the effector pulls the chain into the final position, the velocity of the bones towards their final position tends towards infinity! This is obviously not desirable and can make the animation look jerky and artificial.

Click to enlarge

To achieve the type of motion shown in the lower chain, we need to add an extra object which is used to drive the IK chain effector. A scripted operator links the two objects and we use a mathematical expression to give the desired result. The only bits of information the operator needs are the total chain length, and something I call the “Soft Distance”. This represents the distance from the chain’s full extension that the effect starts to work.

There is one downside with this approach, as it means you can’t fix the end point of the chain in position. However, this can be solved as long as you are willing to put a small amount of extra work to animate the Soft Distance parameter.

The soft effector object has a custom property to allow you to easily control the operator.

To make things easier for you, the Chain Length is calculated by an expression which sums the length of each bone in the chain. This allows you to change the length of a bone, and still have the Soft IK work.

In the diagram below, the Soft Distance is represented by the distance between the green and the red lines (actually, they’re circles, but too large to see). As soon as the effector reaches the green line, our scripted operator starts to lag the chain effector behind our soft effector. This is done while making sure that we have no jerkiness in the motion of the chain effector.

Note: If you are unable to view the GIF animation, you may need to change settings in your Firewall. For example, in Zone Alarm, you need to disable Privacy->Ad Blocking

The equation used to create this effect is shown below:

Click to enlarge

For a chain length of 3 and a soft distance of 1, this equation looks something like this:

Click to enlarge

The next page explains how the system was extended to work with a stretchy bone chain system.

(1 votes, average: 5.00 out of 5)

• Michel M said:

rly great share, ty ðŸ™‚

• Nassos Y said:

I added the ability to check for any positional constraints on the effector
and move them to the newly created SoftEff Null,
so that it integrates nicely with existing Rigs (ex. XSI Biped)
Hope you don’t mind.
cheers

• Chris D said:

Hi Andy, thanks again for sharing this, I need to create this effect for some rigs I’m building just now. I saw it a few years ago but I couldn’t remember where! Your explanation really helped me – nice one

• AndyN (author) said:

Hi Chris, cool, glad you’ve found it useful ðŸ™‚
Cheers!
Andy

• Naoki_Ohta said:

Hi Andy.
Soft IK was awesome in XSI era and helped us a lot.
I came back to your blog post from 2019, to create same function in maya.
Thank you so much for sharing this. Your Soft IK is still staying gold and necessary.

• AndyN (author) said:

Hi Naoki, thanks for your kind words!

`<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> `