Share

Bifrost Rigging Module Framework

The Rigging Module Framework is a modular, compound-based system for building character rigs in Bifrost. It provides a flexible structure and data types for assembling individual rig parts into complete, production-ready rigs.

You can create your own custom modules by starting with the template_module, which serves as a foundation for building rigging modules tailored to your needs.

rigging in the Bifrost graph

What's a module?

A module defines both the structure and the behavior of a specific part of a rig in a self-contained way. Each module is responsible for:

  • Creating a local hierarchy of controls and joints. These may be animated or constrained.
  • Solving the transformations for those entities. This includes defining the rest pose and computing animation. If required, it can involve advanced transformation logic such as IK or space switching.

You assemble modules into a rig using port connections. For example, connecting one module's outputs port to another module's parents input creates a hierarchy.

The parent relationships between entities is fully programmable using the find_parent node inside the user_setup sub-compound. You have full control over how a module's controls or joints are parented under entities in a parent module. This allows for flexible and precise control over rig structure and hierarchy.

Transforms

Control and joint transforms are based on the Core::Transform::Transform type and use shared transformation operations internally. However, module authors are not required to compute these transforms themselves. Transform computation and propagation is handled automatically by the module system.

A module's pins are used to define the rest pose of controls and joints. The rest pose of a transform consists of world space matrix called pivot matrix. Pins are helper transforms that act as guides for their rest transformation. Default pins are stored on the module's inputs port. The relationship between pins and the entities they drive is defined in the module's user_setup sub-compound.

The animation state of transforms is driven by the operator matrix passed to a module's inputs port. The operators are automatically applied on their respective transforms by the module. To do more complex transform operation such as solving an IK, you can work in the user_animation sub-compound.

Within user_animation, you have access to the already-solved transforms, which can be used to compute new matrices that update control or joint transforms. The final transforms are passed to a module's outputs port, so that they can be used by other modules or by objects in the host scene.

Because Bifrost transforms are procedural, pins can be moved at any time to update the rest transformation of controls and joints, even if animation was already applied. The Bifrost transform can also be leveraged by geometry deformers like skinCluster so that you are not required to recreate a bind pose.

For more information about the Core::Transform::Transform type, see The transformation model.

Examples

You can take advantage of the existing modules and examples provided with the framework. Whether you're building a full character rig or exploring how individual parts are constructed, these modules are designed to be both practical and educational.

  • root_module: Serves as the base of your rig hierarchy.

  • arm_module: Demonstrates how an arm with IK/FK blending can be implemented.

For a practical example on how to use rigging modules in a Maya scene, explore the arm_module scene example available in the Bifrost Browser. It showcases how these modules fit into a broader rigging context.

arm_module sample graph

Was this information helpful?