如何执行两个列表的逐元素父约束?

How to perform element-wise parent constraint of two lists?

我正在尝试在两个列表中的元素之间创建父约束,如下所示:

    import maya.cmds as mc
    objCtl= mc.ls('red_ctl', 'green_ctl', 'blue_ctl')
    objJt= mc.ls('red_jt', 'green_jt', 'blue_jt')

    for item in objCtl:
        ctl= item
        makeParentCons= mc.parentConstraint(ctl, objJt, mo=True, w=1)

我正在为每个关节获取一个包含多个驱动程序的 parentConstraint。我知道我必须在列表之间迭代,但我不知道该怎么做。我试过 zip(), append

我既没有任何 Maya 经验,也没有可用的软件。但是,据我了解你的问题(有一些猜测)并且在查看了 ls command and the parentConstraint command 的 Maya 文档之后,似乎你需要从两个列表中生成成对的元素才能创建这两个元素之间的约束。

Maya 的 ls command seems to return a list of elements and parentConstraint 采用多个参数(至少两个 elements/objects 和一些额外的配置参数)在给定元素之间创建约束。

所以退后一步,将问题从 Maya-related 抽象为 'pure Python',您基本上想要从列表中获取对并将每个对传递给另一个函数。一般来说,这可以这样做:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# define sample data, using tuples here, but can be lists as well
# needs to be adopted to the mc.ls() command
objCtl = ('red_ctl', 'green_ctl', 'blue_ctl')
objJt = ('red_jt', 'green_jt', 'blue_jt')

# generate element-wise pairs using zip()
pairs = zip(objCtl, objJt)

# iterate through zip-object and print elements of each pair
# print() needs to be changed to the `mc.parentConstraint()` command
for ctl, jt in pairs:
    print(ctl, jt)

上面给出的这个片段的输出是

red_ctl red_jt
green_ctl green_jt
blue_ctl blue_jt

并且对于约束生成应该是 suitable/adoptable。

万一有人在未来回到这个问题,多个驱动程序的原因是因为您使用 objCtl 作为驱动程序而不是单个元素。

因此,如果我们将其布局,这就是单个循环的样子

makeParentCons= mc.parentConstraint('red_ctl', ['red_jt', 'green_jt', 'blue_jt'], mo=True, w=1)

如果你想对列表中的每一项都这样做,你可以按照其他评论中提到的那样做,然后压缩这两个元素,或者简单地使用循环中的枚举函数从 objJt 中获取值。

    import maya.cmds as mc
    objCtl= mc.ls('red_ctl', 'green_ctl', 'blue_ctl')
    objJt= mc.ls('red_jt', 'green_jt', 'blue_jt')

    for idx, item in enumerate(objCtl):
        ctl= item
        makeParentCons= mc.parentConstraint(ctl, objJt[idx], mo=True, w=1)