Bone Envelope Distance "quadratic decay" not functioning
Open, Needs TriagePublic

Description

System Information
Windows 10, NVIDIA GeForce GTX 970M

Blender Version
Broken: 2.78a
Worked: unknown, but prior to 2.68a

Short description of error
Bone envelope distance should have a falloff to zero influence, but currently it has full influence up until the end of the distance envelope, then it has zero influence. There is no gradual falloff. I am looking at using this for some procedural bone influence controls and found it not working as expected.
Researching further I found this post on StackExchange saying that it worked on a version prior to 2.68a:
http://blender.stackexchange.com/questions/40242/bone-falloff-not-working/70891#70891
Here is a screenshot from that post:

I did some further testing with envelopes of different sizes, both individually and overlapping, and there is no falloff within the bone envelope distance.
#BoneEnvelopeDistanceBug.blend

According to the current documentation in the manual, the expected behaviour is for the envelope is:
"The outside area, materialized by the lighter part around the bone, and controlled by the Distance setting. Inside this zone, the geometry is less and less affected by the bone as it goes away by following a quadratic decay."
https://www.blender.org/manual/rigging/armatures/skinning/obdata.html#bone-deform-options

This quadratic decay is not currently functional.

Exact steps for others to reproduce the error
Using this file which includes a subdivided cylinder and some bones:
#BoneEnvelopeDistanceBug-Steps.blend

  1. Select the cylinder, shift select the bones.
  2. Ctrl P and select "armature deform" (no groups or weights).
  3. Select the cylinder and uncheck vertex weights, check bone envelopes.
  4. Select armature, go to pose mode, move bones.
  5. Test to see flat falloff on envelope

Details

Type
Bug

The decay exist. But bones are not acting like hook modifiers.

Weight groups are used by armature to set the priority of one bone upon another one.
If vertex belongs to only one bone, there is no question : it follows the bone.
If vertex is influenced by two bones, it follows one more than another according to weight.

It works as is for painted weights or weights interpolated from envelopes distances.

bone_enveloppe.blend

Hello Ronan,
thank you for getting back to me. I understand what you are saying, this is not the same as a hook modifier, an additional bone would be needed to get the desired falloff to work. I know envelope weights should not be compared directly with automatic weights, but additional bones or vertex groups are not required to get auto weights to falloff smoothly. Putting that aside, if we add another bone to get the overlapping influences between bones, then we still do not get a smooth falloff. I have tested with many simple scenes and found no result has a smooth transition, so I believe there is still a bug here.

I have created another file with three small bones on one side and one big bone on the other side of the cylinder, then moved the three bones away from the cylinder. In the first example, with automatic weights we get a good result (not surprising). The second example uses just the bone envelopes, with no vertex groups and we see where the envelopes overlap causes some peaks and troughs on the cylinder surface. The third example has envelopes converted into vertex groups with the same result (obviously), while the fourth and fifth examples have had "normalise all" applied with different vertex groups active, with different results.

#BoneEnvelopeDistanceBug-Comparison.blend

The only result that has an acceptably smooth transition between bones is the automatic weights. I would have thought that there is some way to get a smooth transition between bone envelopes, but the way it currently is provides no practical use.

The bone envelopes could be used in conjunction with scripted rigging to assign bones and control influence on vertices through the envelopes via python. Manual weight painting may not always be an option, so how can we get the envelopes to interact with each other and return smooth results on the mesh?

The influence of the envelope is relative to its size and distance.
Basically, modifying any setting in Deform panel of the bone will change the result.
Other choïces than the one done in your file can give smoother results.

For example, ideally, in your file, head and tail of a bone should have same envelope radius.
And if you try to use envelope to obtain vertex groups useable by armature modifier, you have to do it with a skeleton in rest pose. Then, you have to check Multiply option in Deform of each bone to use envelope to compensate bulges from these weight groups.

Result should not be bad. But it can be smoother by using a corrective smooth modifier.
In fact, corrective smooth modifier is so good that you can avoïd to create vertex groups and use only envelopes.
https://www.blender.org/manual/modeling/modifiers/deform/corrective_smooth.html

A case where smooth-envelope falloff is crucial, with no vertex groups desired:

A ripple effect similar to how snakes advance, or snails, or sea slugs.
No, not a wave modifier. The point here is to have fine control over movement: forward, backward, sideways,
and a straightforward way to achieve that is by an armature moving with respect to the object it deforms!
Vertex groups are fixed with respect to the object to be affected; that's not what we want.
What we want is a ripple through the object, as if a vertex group were being smoothly re-defined.

Chris Lee's screenshot shows the abrupt falloff clearly,
and I attest that the problem persists in recent builds (e.g. Jan 18th 2017) of Blender 2.78,
and even on the Experimental Branch build of Jan 15th. (Mac OS)

Chris Lee's screenshot shows the abrupt falloff clearly,
and I attest that the problem persists in recent builds (e.g. Jan 18th 2017) of Blender 2.78,
and even on the Experimental Branch build of Jan 15th. (Mac OS)

As I explained it, Chris Lee's screenshot and .blend file example are the results of a misconception of how envelope influence works in Blender.
Open the .blend file I posted in my comment. It should prove that envelope influence decay can be observed when influences of two bones are overlapping.

The point here is to have fine control over movement: forward, backward, sideways,
and a straightforward way to achieve that is by an armature moving with respect to the object it deforms!
Vertex groups are fixed with respect to the object to be affected; that's not what we want.
What we want is a ripple through the object, as if a vertex group were being smoothly re-defined.

Envelope decay is not use to define a slow parenting relation.
It does not mean a delay between bone movement and vertices movement.
It is just used to set the priority between bones.
Influence defined by envelope at rest pose stays the same when armature takes a new pose.
It will be modified only if settings in deform panel are animated.

You will need a rig more complex than a simple chain of bones and use other bones driven for that ripple.
In fact, it is maybe easier to achieve what you want by using vertex groups and vertex weights modifiers rather than envelopes.

Add Comment