我一直在寻找一种方法来为Maya中的jointchain添加后缀。 联合链具有特定的命名,因此我创建了一个包含所需名称的列表。 第一个链有" _1"作为后缀,结果:
R_Clavicle_1 | R_UpperArm_1 | R_UnderArm_1 | R_Wrist_1
当我创建第二个时,这就是结果:
R_Clavicle_2 | R_UpperArm_1 | R_UnderArm_1 | R_Wrist_1
代码:
DRClavPos = cmds.xform ('DRClavicle', q=True, ws=True, t=True)
DRUpArmPos = cmds.xform ('DRUpperArm', q=True, ws=True, t=True)
DRUnArmPos = cmds.xform ('DRUnderArm', q=True, ws=True, t=True)
DRWristPos = cmds.xform ('DRWrist', q=True, ws=True, t=True), cmds.xform('DRWrist', q=True, os=True, ro=True)
suffix = 1
jntsA = cmds.ls(type="joint", long=True)
while True:
jntname = ["R_Clavicle_"+str(suffix),"R_UpperArm_"+str(suffix),"R_UnderArm_"+str(suffix),"R_Wrist_"+str(suffix)]
if jntname not in jntsA:
cmds.select (d=True)
cmds.joint ( p=(DRClavPos))
cmds.joint ( p=(DRUpArmPos))
cmds.joint ( 'joint1', e=True, zso=True, oj='xyz', radius=0.5, n=jntname[0])
cmds.joint ( p=(DRUnArmPos))
cmds.joint ( 'joint2', e=True, zso=True, oj='xyz', radius=0.5, n=jntname[1])
cmds.joint ( p=(DRWristPos[0]))
cmds.joint ( 'joint3', e=True, zso=True, oj='xyz', radius=0.5, n=jntname[2])
cmds.rename ('joint4', jntname[3])
cmds.select ( cl=True)
break
else:
suffix + 1
我尝试在jntname中添加+1,从而产生了良好的第二链,但第三个链具有" _2"在R_Clavicle_3之后
代码,在我眼里应该有效。任何人都能指出我正确的方向:)
答案 0 :(得分:0)
你永远不会重新绑定 suffix
:
else:
suffix + 1
这是一个无操作。表达式返回2
,然后完全忽略。 suffix
本身引用的值在此不会受到影响。
您想在那里重新分配到suffix
:
else:
suffix = suffix + 1
您也可以在那里使用扩充作业:
else:
suffix += 1
答案 1 :(得分:0)
看起来您的代码也将在场景中的每个关节上运行,这可能不是您想要的。
以下是一些可以帮助您解决这些问题的基本技巧。
使用循环列表 - 您不需要“真实”,循环浏览列表将遍历列表中的每个项目。所以你可以用:
击中场景中的每个关节all_joint = cmds.ls(type='joint')
for each_joint in all_joints:
do_something(each_joint)
python有一个非常简单的非常方便的功能list comprehensions这使您可以非常简单地从旧的列表中创建新列表。例如:
def suffixed_names (side, suffix)
joint_names = ["_Clavicle_", "_UpperArm_", "_UnderArm_", "_Wrist_"]
return [side.upper() + jn + str(suffix) for jn in joint_names]
与你的相同,但输入的次数要少得多(你也可以做左臂!)
Python有一个方便的函数叫做zip,它会从其他列表的匹配项集中创建一个新列表:
names = ['a', 'b', 'c']
values = [10, 20, 30]
name_vals = zip(names, values)
# [('a', 10), ('b':20), ('c', 30)]
Python非常聪明的循环,所以如果你循环一个压缩列表,你可以得到这样的部分:
for letter, number in named_vals:
print letter, number
# a 10
# b 20
# c 30
它有助于将您的功能分解为较小的功能,以便明确发生的事情
把所有这些放在一起,你可能得到类似的东西:
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')
这是对前端的更多规划,但更长时间阅读和使用更容易。 Python列表真棒!倾向于爱#em。