相同的python代码在不同的Maya(2012 - 2015)上的工作方式不同

时间:2015-06-19 09:42:01

标签: python maya maya-api

这个简单的代码

import maya.cmds as cmd

circle1 = cmd.circle(nr=(0, 0, 1), c=(0, -1.1, 0), ch=1)
circle2 = cmd.duplicate(circle1[0], ic=1)
circle3 = cmd.duplicate(circle1[0], ic=1)
cmd.setAttr(circle2[0] + '.rotateZ', 120)
cmd.setAttr(circle3[0] + '.rotateZ', -120)

allCurves = circle1[0], circle2[0], circle3[0]
cmd.select(allCurves)
cmd.makeIdentity(apply=True, t=1, r=1, s=1, n=0)

在Maya 2012中完美运作,给我这个结果:

enter image description here

相反,在Maya 2015中,相同代码的结果是:

enter image description here

所有圆圈移动到原点。

似乎命令cmd.makeIdentity的工作方式不同,但是阅读maya docs命令是一样的。建筑历史记录设置也是相同的。我无法理解玛雅在这些背后的作用。

为什么这行代码的工作方式不同?

3 个答案:

答案 0 :(得分:2)

真正的问题是,当节点有共享历史/连接/节点时,新的Maya(2015)正在准备makeIdentity的方式可能存在错误(在本例中为makeNurbCircle节点)。它似乎正在创建临时transformGeometry节点以补偿链中错误顺序的待冻结变换。 2012年Maya的情况并非如此,当时订单似乎是正确的。如果你看下面的比较,你会明白为什么。

2012年左侧; 2015年右侧: 2012 on the left; 2015 on the right

无论哪种方式,如果您想保留此共享历史记录并以任何原因以这种方式进行冻结转换,您可能必须手动执行makeIdentity尝试的操作,但要以更清晰的方式进行;即,在手动冻结转换变换之前,按正确的顺序正确连接transformGeometry节点(使用xform)。

这是我刚刚做的事情:(我会在以后找时间时用评论和解释更新答案)

import maya.cmds as cmds


def makeIdentityCurvesWithSharedHistory(curves=[]):
    for curve in curves:
        curveShape = cmds.listRelatives(curve, shapes=True)[0]    
        makeCircle = cmds.listConnections(curveShape, type='makeNurbCircle')[0]
        transformation = cmds.xform(curve, q=True, matrix=True)    
        transformGeoNode = cmds.createNode('transformGeometry')
        cmds.setAttr('%s.transform' % transformGeoNode, transformation, type='matrix')
        cmds.connectAttr('%s.outputCurve' % makeCircle, '%s.inputGeometry' % transformGeoNode)
        cmds.connectAttr('%s.outputGeometry' % transformGeoNode, '%s.create' % curveShape, force=True)
        cmds.xform(curve, matrix=[1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0])


circle1 = cmd.circle(nr=(0, 0, 1), c=(0, -1.1, 0), ch=1)
circle2 = cmd.duplicate(circle1[0], ic=1)
circle3 = cmd.duplicate(circle1[0], ic=1)
cmd.setAttr(circle2[0] + '.rotateZ', 120)
cmd.setAttr(circle3[0] + '.rotateZ', -120)

allCurves = circle1[0], circle2[0], circle3[0]
makeIdentityCurvesWithSharedHistory(allCurves)

如果使用上述代码: enter image description here

免责声明:从理论上讲,这应该适用于任何版本的Maya;但我只在2015年的Maya上进行了测试。

答案 1 :(得分:1)

如果您将makeIdentity向上移动链条,它将在视觉上起作用:

circle1 = cmds.circle(nr=(0, 0, 1), c=(0, -1.1, 0), ch=1)
circle2 = cmds.duplicate(circle1[0], ic=1)
circle3 = cmds.duplicate(circle1[0], ic=1)
cmds.makeIdentity(apply=True, t=1, r=1, s=1, n=0)
cmds.setAttr(circle2[0] + '.rotateZ', 120)
cmds.setAttr(circle3[0] + '.rotateZ', -120)

真正的问题是,MakeIdentity会更改几何体,以便在保留相同外观的同时将拥有变换归零;如果您正在共享形状(ic=True),那么当您在多个对象上调用它时,结果会有些随机。检查您的历史记录,您应该在圆形上看到多个'transformGeometry'节点,每个节点都试图影响几何体。

如果你想要在本地归零的实例,那么添加另一个变换可能更容易。

答案 2 :(得分:0)

重复输入连接中的问题。 以前,有一个错误。可能......不确定。

工作代码:

import maya.cmds as cmd

circle1 = cmd.circle(nr=(0, 0, 1), c=(0, -1.1, 0), ch=1)
circle2 = cmd.duplicate(circle1[0], ic=0) #InputConnections=0
circle3 = cmd.duplicate(circle1[0], ic=0) #InputConnections=0
cmd.setAttr(circle2[0] + '.rotateZ', 120)
cmd.setAttr(circle3[0] + '.rotateZ', -120)

allCurves = circle1[0], circle2[0], circle3[0]
cmd.select(allCurves)
cmd.makeIdentity(apply=True, t=1, r=1, s=1, n=0)