我想知道是否有办法执行以下操作,我知道要设置一个对象的翻译,在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)
然而,这显然不起作用,但有人可以告诉我是否有办法做到这一点?
答案 0 :(得分:3)
现在,我不知道pymel或与Maya有关的任何内容,但如果 object.translateX.set(1.5)
有效,那么我认为访问的工作方式与普通对象属性一样,因此您可以获取属性按名称使用getattr(object, attrname[, default_value])
。
BTW 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)
答案 1 :(得分:2)
pymel方法如下所示:
for item in ['translateX', 'translateY', 'translateZ']:
myObject.attr(item).set(0)
答案 2 :(得分:1)
作为正统答案的附录,使用PyMEL你也可以写:
object.t.set([1.0, 1.0, 1.0])
object.r.set([180.0, 360.0, 90.0])
答案 3 :(得分:0)
总结
similarity.append((name_seq, new_score))
或
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)
答案 4 :(得分:0)
如果可以使用单个通配符(*)过滤转换节点,那么您可以获取属性对象,直接按如下方式设置它们:
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)])