Ark - Modular Rigging
Ark is a Component based rigging system for Maya, written in Python with heavy use of PyMel. Utilised in production during the development Fable Legends along with various R&D/experimental projects which gave way to Legends.
The framework of Ark is centered around a central class which is then populated with components. Helper functionality and UI then wrap around the core.
The crucial element to Ark are the components. Component encapsulation allows for each module of a rig to be written and developed in isolation from other components, then plugged togther through the skeleton/guide. Each component is made up of two parts, a Skeletal Class and a Rig Class.
The Skeletal Component
The Skeletal Class exposes the initial up-front parameters which can tailor the build. As an example, a Hand Component may expose such options as finger count and roll joints etc. These options are required up front as they will affect the skeleton that will be generated.
If a joint is given to the Skeletal Class that will be used as the parent for the newly generated skeletal component, otherwise its assumed that the Skeletal Component will form the role of the top level component.
Within Ark 'Maya Containers' were used to encapsulate component nodes, whilst this came with more than expected baggage and frustration (primarily at lack of general application support for containers) - it did give a very easy way to access all nodes within a component easily and reliably. The component hierarchy was formed through the use of 'parent' and 'children' message attributes. This container hierarchy was then traversed during the build process to determine the build order of the components.
In terms of the Skeletal Components themselves, they are typically very simple. Usually just building a series of joints - either through the Maya API, or passing an Xml description file.
The Rig Component
During the build of a rig, Ark traverses the skeletal structure, for each joint tagged as a component root a corresponding Rig Component class is instanced and the build function is called, passing the guide options and control parent.
It is (ususally) this class which holds the majority of the code as this is where all the rig mechanics are constructed. When writing the rig building code the one key responsibility is ensure there is a link that ties each skeleton joint to a node in the rig component. This requirement is what ensures a subsequent rig component can be correctly parented to the relevent control parent.
Takeaways & Credits
This approach to rigging allows for easy extensibility of components - resulting in an ever growing library of rig components that can be utilised during the rigging process for a great many purposes.
As each component knows only of itself its biggest design flaw becomes apparent - to create inter-component relationships becomes tricky. This ultimately results in a series of stacked post scripts for rigs that require more complex behaviours.
Along with the Centralised Asset Manager, the foundation of this was written by myself during the R&D stage in the run up to Fable Legends pre-production. Therefore, it suffers the same issues that the Asset Database suffered from - lack of time.
During this period we made the switch from Softimage to Maya and had to handle the re-writing of all our tools and pipelines - therefore some corners were cut and its code structure suffered. That being said, the next TA to join Legends - Jan Pijpers - was incredibly enthusiastic and motivated and pumped out some great rigs/components through Ark.