今天整了一整天maya中的约束节点的导入和导出,因为动画需求,需要将旧文件中的所有约束信息导出,并导入到新文件中。其实MGTools3.0中就有该功能,用过的同学应该都知道这个:
这个可以说是非常方便了,不管约束类型,偏移,还有约束关键帧,绝大多数情况下都能准确跨maya复制过去。然而某些情况还是会出现问题,比如:A和B同时对C进行parent约束,不过A只约束translateX,而B只约束translateY(虽然这种约束方式很傻逼),这种情况下约束并不能成功复制过去。而且这种复制只能针对性复制,而我们动画的需求是,将场景中所有非引用类别的约束全部导出。
那我们可以列出所有非引用的约束节点,然后直接导出吗?当然不可以。maya的节点网络是牵一发动全身的,例如约束节点的连接关系长这样:
如果直接导出约束,会将该节点所有有直接连接的节点都一起导出。
那可以直接记录约束节点的连接信息(例如约束类别,偏移等),保存到文件里(例如json),然后在新的文件中按照相关信息重新做约束吗?答案是可以,可惜我没这么做,因为要考虑的东西太多了:被约束的属性,偏移,约束类别,动画曲线。。。
在排除上面两个方法之后我做了如下尝试:将所有非动画曲线类别(也就是除了上图左侧蓝色节点以外)的节点连接信息全部记录到json,然后断开,unparent,导出,再在新的场景中导入约束节点,读入json重新做连接。这样既不会导出多余的东西,节点连接信息又能全部保留。思路正确,然而一番尝试之后我又发现了这个不幸的事实:在打断连接之后,约束节点的1W0属性消失了。。。泥煤,导致导入节点之后连不上该属性,百般尝试未果只好作罢。
断开连接之后的1W0属性消失了
只能祭出终极绝招:移花接木。
也就是将上面的思路中的断开操作,变成:新建两个节点replaceA,replaceB,代替之前的约束节点的上游和下游节点,将之前的操作cmds.disconnectAttr(A.a, B.b)变成cmds.connectAttr(replaceA.a, B.b, force=True),一定要加上force=True,这样才可以把连接强行接过去。于是乎,就相当于新建的节点代替原来的约束源被导出。但是没关系,在新场景中恢复连接之后把自建的节点删除就好。下面是思路图: