<p>看起来你的代码也会在场景中的每个关节上运行,这可能不是你真正想要的。在</p>
<p>这里有一些基本的技巧可以帮助你解决这些问题。在</p>
<ol>
<li><p>使用列表进行循环-你不需要“whiletrue”,在列表中循环将遍历列表中的每一项。因此,您可以使用以下方法击中场景中的每个关节:</p>
<pre><code>all_joint = cmds.ls(type='joint')
for each_joint in all_joints:
do_something(each_joint)
</code></pre></li>
<li><p>python有一个非常方便的特性<a href="http://www.secnetix.de/olli/Python/list_comprehensions.hawk" rel="nofollow">list comprehensions</a>,它允许您非常简单地从旧列表中创建新列表。例如:</p>
^{pr2}$
<p>这和你的一样,但是打字少了很多(你也可以做左臂!)</p></li>
<li><p>Python有一个名为zip的便捷函数,它将从其他列表中的匹配项集生成一个新列表:</p>
<pre><code> names = ['a', 'b', 'c']
values = [10, 20, 30]
name_vals = zip(names, values)
# [('a', 10), ('b':20), ('c', 30)]
</code></pre></li>
<li><p>Python在循环方面非常聪明,因此,如果在压缩列表上循环,则可以得到如下所示的片段:</p>
<pre><code> for letter, number in named_vals:
print letter, number
# a 10
# b 20
# c 30
</code></pre></li>
<li><p>它有助于将您的函数分解成更小的函数,这样就可以清楚地看到发生了什么</p></li>
</ol>
<p>把这些放在一起,你可能会得到这样的结果:</p>
<pre><code> def get_original_positions(clav, upper, under, wrist):
# get all the underlying positions in order
results = []
for each_bone in [clav, upper, under, wrist]:
results.append(cmd.xform (each_bone, q=True, t=True, ws=True))
return results
def create_named_arm(side, suffix, clav, under, upper, wrist):
original_pos_list = get_original_positions(clav, upper, under, wrist)
suffixed_name_list = suffixed_names (side, suffix)
cmds.select(cl=True) # clear before starting
created_joints = []
for pos, name in zip (original_pos_list, suffixed_name_list):
created_joints.append( cmds.joint(name, p = pos))
# now loop back and orient the joints...
for each_new_joint in created_joints:
cmds.joint(each_new_joint, zso = True, oj= 'xyz')
return created_joints
# you do need to supply the names of the original joints:
create_named_arm ('r', 1, 'DRClavicle', 'DRUpperArm', 'DRUnderArm','DRWrist')
# a second chain:
create_named_arm ('r', 2, 'DRClavicle', 'DRUpperArm', 'DRUnderArm','DRWrist')
</code></pre>
<p>这是一个更多的前端计划,但更容易阅读和长期工作。Python列表太棒了!学会爱他们</p>