For years traditional single-direction constraining paradigms have been used to create rigs for animators. These single-direction constraint systems force a Character Technical Director to deliver a rig into the pipeline with that single direction state built in. This paradigm has proven to be quite limiting in the scope of the complex animations and characters required in film and games today. As Animators ask for more features to pose and interface with their characters the Character Technical Director community has had to maintain increasingly complicated rigs built on the foundation of these single-direction constraint systems. This is where the ExoSwitch Constraint system shows its versatility. The ExoSwitch Constraint system is by nature a multi-directional constraining paradigm built to give the user the ability to determine "direction" on the fly. And to remove the problem of delivering a character into the pipeline in a pre-determined state, the constraint fully supports animating which transforms at any given time represent the drivers of the system.
Dynamic Posing At the heart of the ExoSwitch Constraint system is the ability to pose rigs intuitively. Our custom node acts as a dynamic switchboard operator to manage live relationships between nodes in the system as the user chooses which node(s) act as the driver and which ones are driven.
Animation Besides being an intuitive posing system the second design principle implemented in the ExoSwitch Constraint is animation. Animators have the ability to keyframe changing the driver(s) of the system. All of the "under the hood" aspects of switching drivers is handled, well...under the hood. Autokey is supported. Animating and auto keying the switching between drivers is supported as well as animating the individual members of the constraint system. Interactive Driver Switching For interactive posing you can put an ExoSwitch Constraint system into a mode where the current driver is the current selection. As the selection changes...so does the driver. This mode allows the animator to pose a rig without having to find the constraint and manually change the driver.
Mask Configurations Mask configurations allow you to setup complex motion relationships between constraint members. An unlimited number of mask configurations can be created on one constraint system giving you the ability to "rig" the constraint itself. For example - a mask configuration can be created so that when the driver node of the system translates in Y the driven nodes (or maybe only one specific node) will not translate in Y. Therefore the translation in Y is "masked" for those nodes.
Split Transformation Drivers The ExoSwitch Constraint has the ability to configure the system with different transforms acting as the translation and rotation driver.
Live Offsets A core feature and design of the ExoSwitch Constraint is live offsets. Many systems that switch a rig between modes or drivers have an inherit offset given the nature of single-direction constraining. In the ExoSwitch Constraint the offset data is continually evaluated when switching driver nodes so that there is no drifting or popping when re-configuring the system.
Native Maya Constraint The ExoSwitch Constraint has been constructed to be a native constraint within Maya. This helps integrate the system and provides intuitive interfacing and workflow.
Native Maya Command We provide a native command along with the constraint node. The command has flags to help execute creation, editing and querying actions on ExoSwitch Constraint systems.
Supports Parallel & Tree Hierarchies In designing the ExoSwitch Constraint we realized that there are many rigging techniques out there and some utilize parallel hierarchies and some tree/leaf hierarchies. We wanted to add freedom to allow any transform from any hierarchy to be added to the ExoSwitch Constraint. By doing this the Character TD and Animator have true flexibility to decide on the fly or predetermine constraint members. You are not forced into a certain paradigm to create or interface with the system.
Constraint System Status Updates To help streamline the ExoSwitch Constraint user workflow we have created a number of features to help deliver status updates on the system: Channel Box Attributes, Attribute Editor with our AETemplate, Shelf buttons on the ExoSwitch Constraint shelf, Auto Driver Select Mode. Constraint System Builder To help create constraint systems faster we have provided a UI where a user can declare the main parts of the system: Translation Driver, Rotation Driver, Driven Objects.
To create a constraint select one or more targets followed by the driving object. Then run Rigging -> Constrain -> exoSwitch More control can be achieved by opening the option menu.
Help Access online documentation of the plug-in. An internet connection is necessary for this menu to be functional Translation Driver The object the constraint is going to use to control the translation of constrained nodes. In the case we only want the rotation of constrained nodes this field can be left blank. Rotation Driver The object the constraint is going to use to control the rotation of constrained nodes. In the case we only want the translation of constrained nodes this field can be left blank. Grab Selected Enter in the input field the object selected in the scene. Remove Item Remove the driven object selected in the Driven Objects field. Remove All Empty the Driven Objects field.
Auto Switch If this option is On (default) the constraint will automatically set the selected object (if connected to the constraint) as the translation and rotation driver of the system. Note: If different drivers were chosen in the UI when creating the constraint their status as drivers most likely will change with the next selection.
Auto Driver Select (autoDriverSelect) If this option is On and there is animation on the constrained nodes the constraint is automatically going to select the current driver at any given frame. Default is Off.
Auto Key Switch (autoKeySwitch) If this option is On then all changes to the transDriver or rotDriver are automatically keyframed. Default is On.
Add Setup the constraint with the inputs specified in the UI. Close Abort the operation without creating a new constraint.
The node has several attributes that control behavior. The attributes that are exposed in the channel box and AE are supposed to be manipulated or monitored by the user.
Trans Driver (transDriver) Shows the current translation driver. To change the translation driver choose one object from the pull down menu. The new object will be removed from the driven nodes list if it is not a rotation driver as well. If None is displayed there is no translation driver. Rot Driver (rotDriver) Shows the current rotation driver. To change the rotation driver choose one object from the pull down menu. The new object will be removed from the driven nodes list if it is not a translation driver as well. If None is displayed there is no rotation driver. Driven Nodes (drivenNodes) Shows a list of nodes that are driven by the constraint. None means no objects are currently being driven by the driver object(s). Disabled Driven (disabledDriven) This pull down menu shows the objects that are still connected to the constraint but have been disabled from its influence. This functionality is for objects that need to be constrained for part of an animation and need to be animated independently in another part of an animation. It only makes sense to disable slave nodes. When a node is a master to the constraint disabling has no purpose as the node already pay attention to its animation. Auto Switch (autoSwitch) If this option is On (default) the constraint will automatically set the selected object (if connected to the constraint) as the translation and rotation driver of the system. Note: If different drivers were chosen in the UI when creating the constraint their status as drivers most likely will change with the next selection. Default is On. Auto Driver Select (autoDriverSelect) If this option is On and there is animation on the constrained nodes the constraint is automatically going to select the current driver at any given frame. Default is Off. Auto Key Switch (autoKeySwitch) If this option is On then all changes to the transDriver or rotDriver are automatically keyframed. Default is On. Sticky Keys If this option is On the constraint makes sure that “boundary keys” (keys where a driver change occurs) stick together when one of them is moved around. A "boundary keyframe" is defined as a key that has an equivalent in the "transDriver" or "rotDriven" attributes. For instance if the constraint changes it's driver at frame 10 from objectA to objectB moving "translateX" of objectA from frame 10 to frame 15 will cause this function to also move "translateX" of objectB from frame 10 to frame 15. The same happen for all the other constrained channels. If the key is moved from the "transDriver" or "rotDriver" curves all the keys from the objects switching at the changed frame get glued together so that the switch will happen at a different frame but still with the same members and at the same position. Default is On
Mask configurations provide an additional layer of functionality on an exoSwitch constraint system. The creator of a constraint system can create any number of configurations or "masks". The masks are a description to the node of how relationships between driver and driven should be structured. The granularity of the mask configuration is on each individual channel.
By providing this access to the node's evaluation engine a user can customize how driven nodes respond when certain channels of the driver(s) are evaluated. And since the node is multi-directional those relationships will change once another node or nodes become the drivers of the system. Hence within one constraint system you can create multiple rigging relationships.
Without masking each constrained object offers the ability to become the driver of the system but what happens if the needed relationship is a little more complex? What happens if object A needs to drive object B and object C but drive object B only in translation? Masking allows this type of customization to the relationships in a constraint system per driver.
Below is some documentation on the basics of masking . The Mask UI provides the ability to setup and configure constraint masks. From within this UI the user can create a new mask, configure it by declaring driver to driven channel relationships, remove existing mask configurations, copy mask configurations and get help on working with constraint masks.
You will need at least one exoSwitch constraint in the scene to use mask UI. The Constraint combo box populates all exoSwitch constraints in the scene and the Mask Configurations combo box populates all masks for the current exoSwitch constraint.
Constraint Members are shown based on the current constraint in the constraint combo box.
Select a member in the list widget then all available attributes will populate in the right tree widget.
Mask Members & Attributes
Click on the attribute(s) to mask attributes or click on the top node (pCube2) to mask all attributes at once
Adding Mask Attributes
Clicking on Configs menu item will give you the ability to create new masks, remove masks, export masks and import masks.
Mask Configs Menu Items
Click on create new mask config and input mask name to create a new mask.
Create A New Mask Config
Click on Remove mask open the dialog and click on “Remove” to remove the selected mask or “Remove All” to remove all masks in an exoSwitchConstraint.
Remove A Mask Config
Exporting & Importing Masks Clicking on Export Mask config will open a file dialog which allows the user to store a *.emask file so the user can use the mask latter. The file is saving per mask data (not all the masks in an exoSwitch Constraint).
Importing a mask config allows the user to import the saved *.emask. Notice the members of the current exoSwitch constraint should be exactly the same in the *.emask.
Click on Clear Current Mask to “un-mask” entire attributes of the current mask. We can also use ctrl+left click on the attribute to “un-mask” the specific attribute. Clear All Masks “un-masks” all masks in current exoSwitch Constraint.
Difference Between Masks And The Weight Attribute
At first glance it may seem that Masks offer the same functionality of the constraint “Weight” attribute. The differences are in fact quite numerous. This paragraph goes through them.
Weight Attribute The constrained position and the animated/disabled position get mixed according to the value of the “Weight” attribute. If a slave “Weight” is not set to 1:
If the slave has animation the curves are used to control his motion.
If the slave doesn't have animation curves the disabled position is used.
If the “Weight” is a 1 the constraint is fully engaged.
Masks Masks are Boolean attributes. An object can be Masked or not, it can't be masked 50%. Masks can also be applied per channel (tx, ty, tz) while the Weight effect the entire position of an object. Masks are relative to specific objects. Object A can be masked by object B but not by object C. The “Weight” attribute influence the object position as long as it's a slave independently from the master.
A marking Menu is available to control some of the functionalities of the exoSwitch Constraint. It is available through the Ctrl-Alt-Left Mouse Click combination while having the mouse hovering over a constrained node.
The Ctrl-l hot-key can be used to turn the exoSwitch Marking Menu On and Off. The marking menu can also be toggled by using the escTogglePopUpMenu mel command.
Key Masters Sets a keyframe for the current object to be a translation and rotation master at the current frame. Note that this command doesn’t keyframe the object itself but the constraint so that it will pay attention to the current object.
Key Trans Masters Sets a keyframe for the current object to be a translation master at the current frame. Note that this command doesn’t keyframe the object itself but the constraint so that it will pay attention to the current object.
Key Rot Masters Sets a keyframe for the current object to be a rotation master at the current frame. Note that this command doesn’t keyframe the object itself but the constraint so that it will pay attention to the current object.
Set Mask To: <mask name> List the available masks for the exoSwitch Constraint connected to the current object. The "None" mask is the default mask and it is always available.
Set Disabled Node To Rest Sets a disabled slave object to the position where the constraint was first connected relative to the position of the master. In other words the relative position among objects belonging to the system is going to be restored using the current masters combination as starting point.
Set To Trans And Rot Master Sets the node under the mouse to be the current translation and rotation master.
Set To Trans Master Sets the node under the mouse to be the current translation master.
Set To Master Sets the node under the mouse to be the current rotation master.
No. The exoSwitchConstraint command will give a "None" value for each driver if not specified during creation. You can change the drivers later using the command with the -edit flag and the -transDriver and/or the -rotDriver flags. You can also use the shelf buttons to add drivers as well as the channel Box and Attribute Editor.
do i need to declare driven nodes on creation?
No. The exoSwitchConstraint command will give a "None" value for driven nodes. You can add driven nodes by using the -edit flag in conjunction with the -drivenNodes flag on a constraint.
Remember if you declare -drivenNodes on any constraint it completely REPLACES the driven node array. If you want to append nodes as driven to the existing ones then use the - appendDrivenNodes flag. Declaring and adding driven nodes can also be done via shelf buttons.
Can drivers be from different hierarchies?
Yes. The translation and rotation drivers can be in the same hierarchy or a different one. They can be the same node as well. One driver can be a child of another as the transformations are split regardless of hierarchical position/format.
Do i need to freeze transforms when adding a node to a constraint?
No. We have accounted for scale pivot offsets when adding and manipulating nodes within an ExoSwitch Constraint system. Beware though that shear is not supported at the moment.
does the rotation driver respect different rotation orders?
Yes. We have accounted for nodes with different rotation orders being a part of the same ExoSwitch Constraint system. Whether a driver or a driven node the rotation orders are calculated properly across the system.
can i add nodes with existing animation?
Yes. When attaching the new node to the constraint system the anim curve is connected to the constraint. Here is information on how animated nodes are evaluated within a constraint::
If the node is driven and animated with drivers then the animation is ignored and the node is fully influenced by the transformations of the drivers
If the node is driven and animated with no drivers then that nodes transforms are influenced by its anim curves
If the node is a driver and it is animated it is influenced by its anim curves
If a driven node with animation becomes disabled it is influenced by its anim curves instead of the drivers. When enabled the influence migrates to the drivers
how do i switch drivers?
There are a number of ways to switch drivers:
By using the exoSwitchConstraint command and the -transDriver and -rotDriver flags
By using the shelf buttons for declaring new drivers
By choosing a node from the connected nodes in the transDriver/rotDriver attributes on the constraint (via Channel Box or Attribute Editor)
By turning on AutoSwitch and selecting an object connected to a constraint
By using the constraint Marking menu (Ctrl-LMM)
can i remove nodes once they are attached to a constraint?
Yes. There are two approaches to doing this - both involve a non-destructive removal of the node from the system. The issue to consider is what to do with any animation existing on the node. If a node is removed without the -preserveAnimation flag then any animation is removed and whatever transform values currently exist on the node remain. If the -preserveAnimation flag is used then the animation curves are preserved and when the node is removed its transformation values will be those represented by the anim curves.
during playback is there a way to see who is the driver(s)?
Yes. We have provided two flags to the command to do this: -autoDriverSelect and -toggleIconVisibility. They can be turned on for a given constraint via the command, shelf button or for Channel Box/Attribute Editor. When the -autoDriverSelect flag is on the current driver node(s) will be selected automatically. It is a convenient way to see what node is driving the system at any specified frame or during playback. When True is passed to the –toggleIconVisibility the constraint will generate visual information right in the viewport.
what is the fastest way to pose/manipulate a constraint?
We have provided a mode where whatever is selected (provided it is connected to an ExoSwitch Constraint) becomes the translation and rotation driver). It is called Auto Switch and you can access this mode via the command through the -autoSwitch flag. There is also a shelf button to turn the mode on or off and it can also be accessed via an attribute in the Channel Box/Attribute Editor.
why do some nodes become disabled automatically?
Since the ExoSwitch Constraint can accept nodes from different hierarchies certain situations can arise where nodes need to be disabled in order for the evaluation to occur in the constraint the way a user would expect. Here are the situations when nodes will become automatically disabled:
A driven node is a parent of either the translation or the rotation driver
A driven node is a descendant of either the translation or rotation driver
A driven node is a descendant of another driven node
does the exoswitchconstraint command work in python?
The exoSwitchConstraint command is a native command in Maya so you can use both MEL and Python.
Graph Editor Displays Curves without Transforms The Graph Editor normally displays animation curves under the transform of the animated object. Due to a limitation in the current Maya API architecture, Maya can only display the curves of animated nodes that are members of the ExoSwitch Constraint system and not its transforms.
Animation Layers Not Supported Animation layers are not currently supported by the ExoSwitch Constraint and as such they can not be employed on objects that are constrained by the ESC.
Character Sets Not Supported Character Sets are not currently supported by the ExoSwitch Constraint and as such they can not be employed with objects that are constrained through the ESC.
Curves Copy/Paste Not Supported Due to a limitation in the current Maya API architecture it is not possible to Copy/Paste curves on nodes connected to an exoSwitch Constraint.
ATOM animation format Not Supported Due to a limitation in the current Maya API architecture it is not possible to use ATOM to import/export animation of nodes constrained with an exoSwitch Constraint.
Mental Ray Animation Optimization Needs To Be Set To Off For Batch Rendering Mental Ray Animation Optimization erroneously detects constrained objects as non-animated. To fix this problem when rendering with Mental Ray go under Render Settings -> Options -> Performance and turn Off "Optimize Animation Detection".
Driven Nodes and Disabled Driven Do Not Update In the Attribute Editor There is a Maya bug with updating enumerated attributes in the Attribute Editor that prevents the Driven and Disabled node attributes in the Attribute Editor to be displayed properly.
Transform Shear Not Supported Transform Shear is not supported. Objects with shear values will behave unpredictably.
Constraint Display System limitation in VP 2.0 The “Behave As Locator” attribute only works in Viewport 1.0 as the functionality that enables it doesn’t exists in Viewport 2.0