The goal I am trying to achieve with our Modular Rigging System is to stream line the rigging process and minimizing the manual creation processes to a minimum. Here just a few features, which in my opinion make this kind setup so attractive:

  • As rigging templates can be inherited, the creation of an additional character of a similar type is done very fast.
  • No problem to update the rig under the hood, as on the recreation of a rig the updated modules will be used automatically.
  • Modeling changes happend? Just recreate the rig and you are fine most of the time.
  • As the rig is just plain python code, it is way easier to track down problems as compared to navigating through thousands of nodes in the Maya NodeEditor.
  • Rig iterations are incredible fast.


Below you can see the basic scheme of the Modular Rigging System.

If the rig template for the character with all its needed modules are created, building a rig is just a matter of a couple of lines, for example:

import DW.rigging.modular.rigTemplates.Duel.templates as duelTemplates

rig = duelTemplates.BeastBoy()

Here you can see a screen cast video showing the rig building process for a character used in the short DUEL.

ARVE Error: Mode: lazyload not available (ARVE Pro not active?), switching to normal mode
Modular Rigging System | DUEL

If you want to have a deeper look how the rigTemplate for this character is setup have a look at the Duel – Rig Template Example.


The system is heavily using Red9 MetaData API which is part of the Red9 Studio Pack to track information an make it accessible during and after the rigging process. Additionally the Studio Packs comes with the ability of mirror poses and animation and a bunch of other useful tools.

There is a Getting Started Guide in the Red9 Studio Pack Git. Have a look at it to see what you can do with it.

The Example below shows how we can create a space switch with the help of the my custom rigCtrl class and red9 MetaClass objects.

rigCtrlEyes = mCtrl.rigCtrl(self.mEyes.CTRL_Main[0])
rigCtrlEyes.createSpaceSwitch([self.mNeck.CTRL_FK_2[0], self.mRig.HOOK_Default[0]], ['neck', 'global'], defaultParent= 'neck')

Here comes a screenshot of the different MetaClass types used in the rigs: