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:
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, type=’controller’)
parent_plugs = mc.listConnections(plug, p=True)
buf = mc.listConnections(plug)
for parent_plug in parent_plugs:
mc.connectAttr(‘%s.parent’ %buf, parent_plug)
mc.connectAttr(‘%s.prepopulate’ %parent_plugs.partition(‘.’), ‘%s.prepopulate’ %buf)
I hope you find this to be useful! Feel free to leave any questions or comments.