<p>我以前用过Weeny博士的想法,你可以通过对象的长名称遍历层次结构。这个答案的不同之处在于,如果场景中有重复名称的对象,脚本不会崩溃。我的意思是,假设你有两个等级:</p>
<p><code>group1>>joint1>>joint2>>group2>>joint3</code></p>
<p>以及</p>
<p><code>group3>>joint1>>joint2>>group2>>joint3</code></p>
<p>Maya很容易允许这样做,例如在复制顶部节点时,因此我们需要防止脚本在这种情况下崩溃。如果存在多个具有重复名称的对象,如果尝试访问对象的短名称,Maya将崩溃(它不知道您指的是哪个!),因此我们必须始终使用它的长名称:</p>
<pre><code>import maya.cmds as cmds
jnts = cmds.ls(type="joint", l=True) # Collect all joints in the scene by their long names.
output = set() # Use a set to avoid adding the same joint.
for jnt in jnts:
pars = jnt.split("|") # Split long name so we can traverse its hierarchy.
root_jnt = None
while pars:
obj = "|".join(pars)
del pars[-1] # Remove last word to "traverse" up hierarchy on next loop.
# If this is a joint, mark it as the new root joint.
if obj and cmds.nodeType(obj) == "joint":
root_jnt = obj
# If a root joint was found, append it to our final list.
if root_jnt is not None:
output.add(root_jnt)
print(list(output))
</code></pre>
<p>在上面的层次结构上使用此脚本将返回</p>
<p><code>[u'|group1|joint1', u'|group3|joint1']</code></p>