Better Pickwalking With Maya’s Controller Node

Here’s a few tips on how to use controller nodes for a more complex/user friendly pickwalking setup which can reduce the need for custom pickwalking scripts.

part 1 – Background/overview:

part 2 – Main principles:

part 3 – Additional complexity:

part 4 – Suggestions for Maya developers:

Just to clarify, this is not about rig controls (nodes that you use to control a rig) – it’s specifically about the new(ish) controller nodes in Maya that have some pickwalking built into them. Look here for a developer’s breakdown of the controller nodes:


The controller node pickwalking seems to work pretty great for simple ‘control hierarchies’ but becomes less useful as you branch off more and more siblings/grandsiblings. I posted a question on the maya forums about some pickwalking issues I ran across using these controller nodes and it gained no responses after 2 weeks… So, I did some experimenting and found a few tricks to make it inherently work a little better. If you are interested, here’s a link to that question on the forums:

https://forums.autodesk.com/t5/maya-animation-and-rigging/controller-node-issues/td-p/7402706

I wanted to try my best to not require a custom pickwalking setup to keep extra ‘clutter’ down to a minimum – whether writing my own, or using some that can be found online… If Maya can inherently do something, it usually works faster than jumping through some other hoops yourself. Fortunately, I was able to get something that works pretty nicely for possibly 90-95% of situations. I also made some suggestions that would push it over the edge to ‘fully usable’ status that the developers will hopefully take into consideration.

here’s the script I wrote for grouping controller nodes and maintaining the ‘parent chain’ of controller nodes:

import maya.cmds as mc

# group selected controls and parent group to first control’s
# parent to retain an unbroken chain
#
controls = mc.ls(sl=True)
plug = ‘%s.parent’ %mc.listConnections(controls[0], type=’controller’)[0]
parent_plugs = mc.listConnections(plug, p=True)
mc.controller(controls, group=True)
buf = mc.listConnections(plug)[0]
if parent_plugs:
for parent_plug in parent_plugs:
mc.connectAttr(‘%s.parent’ %buf, parent_plug)
mc.connectAttr(‘%s.prepopulate’ %parent_plugs[0].partition(‘.’)[0], ‘%s.prepopulate’ %buf)

I hope you find this to be useful! Feel free to leave any questions or comments.