Multi Driver

The Multi Driver UE5 anim bp node allows you to drive multiple curves or bones at once, using just one node and a data table with all the mapping rules. It’s a batched version of the Bone Driven Controller node. It simplifies your anim graph and removes the overhead of running multiple nodes. Additionally, it fixes the gimbal problem, allowing to use rotation around Y axis beyond 90° and it also allows for different modes like add, replace, multiply, min or max.

Multi Driver node
Multi Driver node inside an anim BP.

To use the Multi Driver you need to create a data table with mapping rules. You can create it from the node’s properties panel using “Create New Asset” menu or from the content browser using “Miscellanious -> Data table” and choosing “MultiDriver_Map” as the struct type.

Data table with mapping rules. For better organization we separate various rulesets using a composite table

Each line of the data table specifies one mapping rule. The rule is defined like so:

  • Source and Source Component: Name of the source bone and the data we want to use as driver. For example: “lShin” and “Rotation X” means we want to use rotation around X axis of the left shin bone as driver.
  • Target and optional Target Component: This is what we want to drive. Target can be a name of a curve or a bone, in which case we also need to specify its component. For our shin example, we will specify the name of the corrective morph here.
  • Source min/max and Target min/max. Those are the parameters for the mapping. We will linearly map the input value in the interval (Source min, Source max) to the interval (Target min, Target max). We use degrees in case of rotations.
  • Clamp: selects between clamped and unclamped mapping. Clamping mapping clamp the output between target min and max.
  • Mode: specify how to store the result. “Replace” will simply replace the target with the new value, other modes will combine the result value eand the target value. It allows to use more than one driver for one curve for example.
Example of a mapping rule

Example: let’s say we have the knee bone “lShin” rotating around X axis and the associated corrective morph “ShinBend90_L” (from 0° to 90°). We can drive that with a rule with source “lShin rotation X”, target “ShinBend90_L”, source (min, max) = (0°, 90°) and target (min, max) = (0, 1). If the knee is rotated 45° the node will set the ShinBend90_L = 0.5 and the corresponding morph target will be applied. Clamped mapping will keep the output value between 0 and 1.

You can use the Multi Driver in a post process anim bp to drive all your correctives.

Post process ABP

And just for comparison, the picture below is what the setup would look if we had to use multiple Bone Driven Controller nodes instead :

Similar setup using the Bone Driven Controllers

Demo project: step by step tutorial

Here a simple tutorial to help you get started with the plugin. We will be using the example project provided with the plugin. In the example project you find a skeletal mesh SK_Demo with 3 corrective morphs called jcm_joint2, jcm_joint3 and jcm_joint4 associated to the corresponding bones. We will create a post process anim blueprint to drive those morphs.

Example skeletal mesh with morphs

Step 1: Create Post Process Anim Blueprint

To create an anim blueprint right click on SK_Demo in the Content Browser then “Create -> Anim Blueprint”. Rename it to something meaningful, like ABP_DemoPP.

In the blueprint add “Input pose” and “Multi Driver” nodes, like so:

In “Multi Driver” node properties, use Driver Map asset to create a new Data Table

We’ll call it DT_Demo and use MultiDriver_Map as the Row Structure

Finally, In the SK_Demo we’ll navigate to the Asset Details and set the Post process anim bp to ABP_DemoPP

Step 2: Add rules in the data table

Open the data table DT_Demo and add 3 rows

Our corrective morphs are defined for -90° Y rotation on all three bones. It means when the rotation is -90° the morph is applied fully and when it’s 0° the morph is not applied. We will define this behavior using the rules as those:

You can copy paste the code bellow in your table, row by row:

(Source="joint2",SourceComponent=RotationY,Target="jcm_joint2",TargetComponent=None,Mode=Replace,SourceMin=0.000000,SourceMax=-90.000000,TargetMin=0.000000,TargetMax=1.000000,Clamp=True)

(Source="joint3",SourceComponent=RotationY,Target="jcm_joint3",TargetComponent=None,Mode=Replace,SourceMin=0.000000,SourceMax=-90.000000,TargetMin=0.000000,TargetMax=1.000000,Clamp=True)

(Source="joint4",SourceComponent=RotationY,Target="jcm_joint4",TargetComponent=None,Mode=Replace,SourceMin=0.000000,SourceMax=-90.000000,TargetMin=0.000000,TargetMax=1.000000,Clamp=True)

Step 3: finished result

To test that our corrective morphs are working properly open the animation sequence AS_DemoAnim. Make sure the post process is running. You should see the morph target applied properly when the joints bend

Switch the post process on and off to see the difference!