Rig in Cascadeur includes several categories of objects: Point Controllers, Rigid Bodies etc. Within each one of these categories, the objects are structured hierarchically: for example, a Point Controller can have a parent Point, to which it is attached, and it can also have one or more children Points, which would be attached to it.
But this is not all.
Each and every object is also connected to several objects of different types: for example, a Point Controller is always attached to a Rigid Body, which in turn is linked to one or several Joints.
These connections are a part of a system we call a Dependency Graph.
Its purpose is making parts of the rig able to influence other parts: for example, when you move Point Controllers, the Rigid Bodies connected to them should move as well.
Structures like this are often represented as graphs, or sets of connected nodes.
Graphs are structures made of nodes and connections between them.
Nodes have input and output attributes
For the rig to work correctly, these graphs should be acyclic, i.e. they shouldn’t include closures. Also, any of the node inputs should only have exactly one active incoming connection. Otherwise, the rig won’t be able to function properly.
Left: acyclic graph. Right: cyclic graph.
Character rig in Cascadeur works in an ‘omnidirectional’ way: for example, you can move Point Controllers, and the Joints that are linked to them will move as well; but you can also move the Joints themselves, and the Point Controllers would move with them.
The same principle applies to every type of object that makes up the rig.
Normally, a setup like this would lead to cycles occurring in the character rig, but Cascadeur has a system designed specifically to prevent them. This is achieved by separating the rig into two parts:
Setting Graph receives input data and, based on them, defines which functions in the data graph should be activated and which should not.
Data graph works with object parameters such as coordinates, rotations and so on.
The character rig is updated with the help of these graphs.
1. First, user input is received.
Aside from moving objects, copying and pasting their positions, mirroring etc, this includes actions that do not require direct participation on the user’s side: AutoPosing, Secondary Motion and so on. Generally, any alteration made to the scene is recognized as user input.
The input data is separated in two parts:
First is the information about changes: this part describes which values have been changed.
This part is transferred to the Setting Graph.
Second is the actual updated values: this part describes how the values have been changed.
This part is transferred to the Data Graph.
Both these parts are used in the update cycle.
2. The information about changes - the first part of the input data - is transferred to the Setting Graph. Based on this information, the Setting Graph defines which functions in the Data Graph should be updated.
3. After this, corresponding parts of the Data Graph are activated, and the updated values (the second part of the user input) are used to appropriately modify corresponding parts of the rig.
4. Then, relaxation is called. It updates the positions of the Rigid Bodies to fit with the updated controllers.
Relaxation is a rather complex process. It is described in greater detail on the dedicated page.
5. Finally, the Setting graph is called once again, only this time it uses the new positions of the Rigid Bodies as input data.
After that, the Data Graph is subsequently updated.
Scene update can work in several modes. Which mode is used depend on the UpdateLevel parameter found in the Settings window, under the SCENE tab:
The value of this parameter set how ‘deep’ is the update:
When the value is set to 1, the steps 1 to 3 from the update cycle algorithm (described above) are called, while the remaining steps are ignored.
This can be described as the algorithm only updating the Rigid Bodies directly linked to the controllers adjusted by the user.
When the value is 2, steps 1 to 4 are called; after step 4 is executed, the data is copied back to the rigid bodies.
With this setting, every Rigid Body is updated, but other elements of the rig are ignored.
With the value of 3, the whole algorithm is executed, and the entire rig is updated.
This is the default setting.