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