4

这个简单的代码

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 文档该命令是相同的。构建历史设置也相同。我不明白玛雅在幕后做了什么。

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

4

3 回答 3

2

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

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

无论哪种方式,如果您想保留此共享历史并出于某种原因以这种方式进行冻结转换,您可能必须手动执行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)

如果使用上面的代码: 在此处输入图像描述

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

于 2015-06-19T18:52:53.860 回答
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”节点,每个节点都试图影响几何图形。

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

于 2015-06-19T18:22:27.510 回答
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)
于 2015-06-19T14:28:55.983 回答