Caveats ======= Because Contour Rig Tools does some things in ways that are non-standard for Maya, there are a few caveats that you'll need to bear in mind when using Maya's tools with Contour. Maya 2023.0 and 2023.1 ---------------------- We only officially support the most recent update of each Maya version, but Contour will often work with older updates. However, Contour does not work in Maya 2023.0 and 2023.1. If you are running Maya 2023, please make sure you've updated to version 2023.2 or later. Overrides and constraints ------------------------- .. _Joint Override Constraints Caveat: Constraining to a joint with rotation overrides ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Rig Tools joints, bones, and bone CVs are all custom transforms that calculate their own matrices. This allows features like Override Rotation, where instead of using the rotate values from the transform's rotate attribute, the joint uses a different set of rotation inputs to calculate its matrix. This greatly simplifies some aspects of rigging. This does, however, introduce an additional complexity---Maya's constraints do not use the matrix of the transform constrained to (which is generated using the input values), but instead uses the values of the transform's rotation attribute. So if you constrain to a Rig Tools joint, the constraint will use the rotation values present in the channel box, not the joint's actual rotation. In Maya 2020 and later, the simplest solution is to avoid constraints and use matrix nodes instead, plugging the result into the target node's Offset Parent Matrix attribute. For users who are using earlier versions of Maya, or who aren't familiar with Maya's new matrix-based rigging workflow, there are a couple of simple workarounds. One option is to constrain to a null that has been parented to the joint, instead of constraining to the joint itself. .. figure:: images/fig01_extraConstraintNode.png Figure 1 This workaround is easy to set up, but adds an additional transform to the rig. A slightly more complex solution is to pipe the joint's matrix into a decomposeMatrix node to extract its actual rotation. This rotation value can be plugged into a constraint, or used to drive the rotation of another node directly. .. figure:: images/fig02_decomposeMatrix.png Figure 2 Connecting the output of a constraint into Override Rotation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Override Rotation is normally used to receive rotation values from Rig Tools IK systems, but you can drive it with any other source of rotation values. However, driving the Override Rotation attribute with the output of a Maya constraint causes Maya's cycle check to incorrectly identify the result as a circularity. Since you don't get the same error when connecting the output to the joint's rotation attribute (which would be just as circular), this appears to be a problem with Maya's cycle check. To work around this, just create a null in the same parent space as the joint, constrain it normally, and connect its rotation to the joint's Override Rotation attribute. This has the same effect, but does not cause a cycle check error. .. figure:: images/fig03_proxyConstraintNode.png Figure 3 Issues Related to Cached Playback --------------------------------- There are a number of issues affecting Contour that occur when using Maya's Cached Playback. As far as we can tell, these are caused by bugs in Maya's implementation of Cached Playback, and we have submitted bug reports to Autodesk where appropriate. Some of these issues have been fixed in later versions of Maya. Below is a description of the issues we are aware of, and workarounds for them, where workarounds exist. It is possible that there are other issues involving Cached Playback that we are not yet aware of. Maya 2019/2020 and Cached Playback ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In Maya 2019 and 2020, custom transforms that calculate their own matrices do not behave correctly when directly manipulated when Cached Playback is active, intermittently jumping to locations from frames other than the current frame. This bug only occurs when a custom transform---for instance, a Contour joint, bone, boneCV, or socket---is directly manipulated. This can be worked round by introducing additional conventional transforms to use as controls. This can be as simple as inserting a NURBs circle between a joint and it's parent bone, or as complex as having a separate control hierarchy (as is normally the case in conventional rigs). This bug is fixed in Maya 2022. Referencing A Rig With Contour Constraints More Than Once In the Same Scene With Cached Playback Enabled ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In Maya versions starting with 2020, loading a scene that references a file more than once will cause Maya to crash if that file contains any of our constraints (or any custom constraint with a custom data attribute), and Cached Playback is enabled. This appears to be caused by a bug in Maya's implementation of Cached Playback. We have submitted a bug report to Autodesk. There are a number of workarounds for this. A simple workaround is to duplicate the referenced file on disk, and then reference each duplicated file only once. But this can be a bit awkawrd, especially in cases where you want to reference a file many times. If you need to reference the same file more than once in a scene, you can do this by ensuring that the references are not loaded until after the scene has finished loading. To prevent the references from being loaded, select "Load no references" from the "Load Settings" drop-down in the "Referencing" section of the File ► Open Scene options box. This will prevent references from being loaded when the scene is loaded. Manually loading them after the scene has loaded will not cause Maya to crash. Manually loading references each time a scene is loaded is not ideal. This can be automated by adding a script node to the scene that executes on load. The script node should use Maya's "evalDeferred" command to execute code that causes the desired references to be loaded. This will execute the code on the next idle cycle, which will not occur until the scene has finished loading. Starting with Contour version 1.0.8 we include a facility for creating a script node that will automatically load all references in a scene after the scene has loaded. To add a script node that does this to the current scene, execute the following in a Python tab in the script editor: .. code-block:: python import Contourlib.users.utilities Contourlib.users.utilities.createLoadReferencesScriptNode() Maya Controller Nodes and Cached Playback ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With parallel eval, Maya introduced the concept of a Controller Node, which is used to tag certain nodes in the scene as Controllers, which indicates that Maya should begin with those nodes when tracing the Evaluation Graph, even if the do not have keyframes. Controller Nodes can also be used to modify Maya's pick-walking behavior. In Maya versions prior to Maya 2023, when Cached Playback is enabled and Controller Nodes are used in conjunction with Contour rigs, evaluation errors may occur during playback. Unfortunately, there is no workaround for this, other than not using Controller Nodes, or disabling Cached Playback. This bug is fixed in Maya 2023.