1

我想知道是否有办法执行以下操作,我知道要设置对象的翻译,在 pymel 中它就像这样简单:

object.translateX.set(1.5)

您还可以使用“setAttr”命令进行设置:

setAttr(object + '.translateX', 1.5)或者setAttr('%s.translateX' % object, 1.5)

但是,如果我只想将第一个示例用于属性名称会更改的更高级的东西怎么办?

例子:

object.translateX.set(1.5)
object.translateY.set(1.5)
object.translateZ.set(1.5)
object.rotateX.set(1.5)
object.rotateY.set(1.5)
object.rotateZ.set(1.5)

我宁愿写这样的东西:

for i in range(0,5,1):
    t = ['translateX', 'translateY', 'translateZ', 'rotateX', 'rotateY', 'rotateZ']
    object.t[i].set(1.5)

然而,这显然不起作用,但有人可以告诉我是否有办法做到这一点?

4

5 回答 5

3

现在,我不知道 pymel 或与 Maya 相关的任何内容,但如果 object.translateX.set(1.5)有效,那么我认为访问就像普通对象属性访问一样工作,因此您可以使用getattr(object, attrname[, default_value]).

顺便说一句range(0, 5, 1),与range(5); 并且表示列表 [0, 1, 2, 3, 4];您的列表有 6 个元素,因此您需要range(6)对其进行迭代 - 但对于循环可以迭代任何可迭代对象,您应该只迭代您的属性名称。因此:

attributes = ['translateX', 'translateY', 'translateZ', 
              'rotateX', 'rotateY', 'rotateZ']
for a in attributes:
    getattr(object, a).set(1.5)

应该做你想做的。

更新:pymel 似乎也支持.attr()对象,因此

for a in attributes:
    object.attr(a).set(1.5)
于 2013-08-22T06:28:48.263 回答
2

pymel 方法如下所示:

for item in ['translateX', 'translateY', 'translateZ']:
   myObject.attr(item).set(0)
于 2013-08-22T15:47:14.090 回答
1

作为 theodox 答案的附录,您还可以使用 PyMEL 编写:

object.t.set([1.0, 1.0, 1.0])
object.r.set([180.0, 360.0, 90.0])
于 2013-08-22T21:25:20.917 回答
0

总结

import pymel.core as pmc
cube= pmc.polyCube()

attributes = ['tx', 'ty', 'tz', 
              'rx', 'ry', 'rz']

for a in attributes:
    cube[0].attr(a).set(1.5)

或者

cube[0].t.set([1.5]*3)
cube[0].r.set([1.5]*3)
于 2016-03-27T04:28:21.323 回答
0

如果可以使用单个通配符 (*) 过滤您的转换节点,那么您可以让 Attribute-objects 直接设置它们,如下所示:

import pymel.core as pm
for tX in pm.ls('spine*_jnt.translateX'):
    tX.set(0.0)

如您所见,“ls”函数也可以列出属性,但不能接受复杂的正则表达式模式。这样,您还可以使用标识属性标记场景中的节点,并可以通过列表收集它们,如此处所示。如果需要,您可以一次性设置向量:

import random as rnd
for t in pm.ls('treeA_*.translate'):
    t.set([rnd.uniform(-20,20), 0.0, rnd.uniform(-20,20)])
于 2016-09-01T16:56:06.213 回答