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

相同的python代码在不同的Maya上的工作方式不同(2012-2015),python,maya,maya-api,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

这个简单的代码

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中效果非常好,给了我以下结果:

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

所有圆都移动到原点

命令
cmd.makeIdentity
的工作方式似乎有所不同,但读取maya文档的命令是相同的。此外,构建历史设置也是相同的。我不明白玛雅在幕后做什么


为什么这些代码行的工作方式不同?重复输入连接中存在问题。 以前,有一个bug。可能不确定

工作代码:

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)

如果将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”节点,每个节点都试图影响几何体


如果希望所有实例都在本地归零,则只需添加另一个变换可能会更容易。

真正的问题是,当节点共享历史/连接/节点时,新Maya(2015)执行
makeIdentity
准备工作的方式可能存在缺陷(在本例中为
makeNurbCircle
节点)。它似乎正在创建临时
transformGeometry
节点,以补偿链中错误顺序的待冻结变换。Maya 2012中的情况并非如此,当时的顺序似乎是正确的。如果查看下面的比较,您将看到原因

2012年在左边;2015年在右边:

无论采用哪种方式,如果出于何种原因希望保留此共享历史并以这种方式执行冻结变换,则可能必须手动执行
makeIdentity
尝试执行的操作,但要以更干净的方式执行;即,在手动冻结transfo之前,以正确的顺序正确连接
transformGeometry
节点转换上的格式(使用
xform

下面是我刚刚想做的事情:(我会在以后有时间的时候用评论和解释更新答案)

如果使用上述代码:


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

不幸的是,我需要
ic=True
,因为代码示例是整个工具的一部分。我也尝试使用
ic=0
,稍后连接输入,但问题再次出现。
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)