Weights are the animatable attributes that represent the interface between the animator and the node, just like in the Blend Shape node.

DataPoints—like Blend Shape targets—contain deformation data, but they are not bound (a priori) to any one specific weight. Also, dataPoints by themselves cannot be animated directly.

However, there is a non-trivial connection between weights and dataPoints. The freedom in how you connect weights with dataPoints makes things like combination-sculpting possible.

To get the typical Blend Shape behavior, you would, for each weight, connect exactly one dataPoint to it.

Combinations are achieved by connecting one dataPoint to two or more weights. Strictly speaking, you connect the dataPoint to a certain position (i.e. value) a weight can have. This will usually be the position 1.0. This means you can get inbetweens by connect a dataPoint to a position other than 1.0.

Connecting a dataPoint to a weight’s value is called positioning a dataPoint. Each dataPoint has a position consisting of a certain value of one or more weights. This means that dataPoints contain two things, a position and their deformation data (their deltas).

Here is another diagram illustrating the above explanation.

Advanced Info

Mathematically speaking, dataPoint positions are elements of the n-dimensional vector space spanned by the n weights. This space is called the weight space.

In the diagram, you see that the weights and the position of the dataPoints together lead to dataPointWeights. These represent the influence each individual dataPoint has. Taking these dataPointWeights and applying them to the dataPoints’ deltas leads to the actual deltas. In the deformation box, the deltas are multiplied with the envelope value and the painted values. Adding them to the input geometry results in the output geometry. It should now be clear how the animation controls the deformation.

What does a dataPoint do when it is connected to one weight?

If you have a dataPoint at the value 1 of a weight, the dataPoint is faded in and out when you change the weight from 0 to 1 and back to 0. This is exactly the same as with a Blend Shape target. You usually have such a dataPoint for every weight. Such a dataPoint is called a dataPoint with a plain position or a plain dataPoint.

What does a dataPoint do when it is connected to two weights?

This is where it gets interesting. Such dataPoints are combination dataPoints. They are used when the mix of two plain dataPoints does not produce the desired shape. Creating a dataPoint and placing it at the two weights that don’t mix well enables you to exactly model the result of this mix.

Let’s say we have a smile (AU 12) and a shape that pulls up the top lip (AU 10). During a smile, the top lip cannot be pulled up as much as without. This is a situation where a combination dataPoint can be used to reduce the influence of the lip pulling of AU 10.

Hint

In a situation like this, the combination can be modeled really quickly using PaintDeform with the Smile shape as target object.

In essence, a BCS setup consists of the following parts:

  • A weight for every elementary movement into which you want to decompose the facial expressions (e.g. AUs).

  • A plain dataPoint for every weight, which creates the main appearance change of the weight.

  • Combination dataPoints for correcting certain mixes.

  • Inbetweens for non-linear movements and/or non-linear combinations.

Relative and Absolute DataPoints

A normal dataPoint can be either relative or absolute. This property only affects its behavior when influencing dataPoints change.

As an example, consider a mouth open shape (AU 27) and a smile shape (AU 12). Let’s also say you have a combination dataPoint for mouth open + smile and this dataPoint is relative. If you now tweak the smile shape, this change will “trickle” through to the combination! If the combination dataPoint were absolute, the change would be canceled out by the combination.

Note

There is one caveat, though: If you have edit geometry for a dataPoint, this geometry overrides any effect of the absolute or relative setting.

Another example: Let’s say you have created AUs 10 (upper lip up), 12 (smile), and their combination. Later you see that you want the ear move a little bit in a smile (AU 12). If the 10+12 dataPoint is relative and you make the adjustments in the plain dataPoint of AU 12, the 10+12 dataPoint will also have the ear moved, since the change trickles through. Pulling the upper lip up (AU 10) while smiling (AU 12) will then not move the ear, since AU 10 doesn’t move it, nor does 10+12 change the ear.

Back to where we have just decided to move the ear when smiling (AU 12). If 10+12 is an absolute dataPoint while we make the tweaks for AU 12, the combination 10+12 will keep its shape and sort of back-corrects these changes. Pulling the upper lip up (AU 10) will then move the ear back into its neutral state, even though AU 10 has nothing to do with the ear. The 10+12 dataPoint does this because as it was created, the ear was in the neutral shape and the dataPoint had been set to absolute.