通过最后一个数字(maya python)育儿多个对象

时间:2018-10-08 10:05:30

标签: python parent maya pymel

我目前正在编写脚本,以制作简单的类似起重机的钻机。

我有一个变量来定义我想要的关节数量。对于我想要的组/控制器的数量,我也有一个变量。这些数量可能会有所不同,因此脚本将是半“动态”的。

所以我最终得到的是几个关节(joint1,joint2,joint3等) 以及几个组(group1,group2,group3等)。

我的问题是我不知道如何将我的“ group1”与“ joint1”和“ group2”与“ joint2”等一起育儿。 由于我希望能够更改关节和组的数量,因此无法对其进行硬编码。

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:1)

这样可以帮助您吗?

grp = cmds.ls('group*')
nbs = [int(n.split('group')[-1]) for n in grp]
grpDic = dict(zip(nbs, grp))

joint = cmds.ls('joint*', type='joint')
nbs = [int(n.split('joint')[-1]) for n in joint]
jointDic = dict(zip(nbs, joint))

common = list(set(grpDic.keys())&set(jointDic.keys()))

for i in common:
    cmds.parent(grpDic[i], jointDic[i])

编辑:包括nurbs育儿

# filter by nurbs type    
nurbs_sh = cmds.ls('nurbsCircle*', type='nurbsCurve')
# get the transform node of this nurbs
nurbs_tr = cmds.listRelatives(nurbs_sh, p=1)
nbs = [int(n.split('nurbsCircle')[-1]) for n in nurbs_tr]
curveDic = dict(zip(nbs, nurbs_tr))

common = list(set(grpDic.keys())&set(curveDic.keys()))
# nurbs parent to group
for i in common:
    cmds.parent(curveDic[i], grpDic[i])

答案 1 :(得分:1)

@DrWeeny的示例将采用现有的对象和现有的关节并将它们作为父对象。如果您只想从几何图形开始并自动向其中添加接缝,则可以尝试如下操作:

import re

def add_joints_to_selected(orient = 'xyz'):
    selection = cmds.ls(sl=True)
    cmds.select(d=True)
    joints = []
    for geo in selection:
        pivot = cmds.xform(geo, q=True, rp=True, ws=True)
        suffix = '0'
        raw_name = re.findall( "\d$", geo)
        if raw_name:
            suffix = raw_name[-1]       
        jnt = cmds.joint(n = "joint_" + suffix, p=pivot)
        cmds.parent(geo, jnt)
        joints.append(jnt)
    if orient:
        cmds.joint(joints[:-1], e=True, oj = orient)

add_joints_to_selected('xyz')  # or add_joints_to_selected(None)

此节点获取选定节点的枢轴点,并为每个节点创建关节(按您选择它们​​的顺序)。如果您提供“ xyz”或“ yzx”之类的关节命令,它将使关节对齐,就像您手工绘制它们一样;否则关节是世界对齐的。唯一棘手的问题是使用正则表达式从现有节点名称中获取后缀(如果没有数字后缀,则回退为“ 0”)