变换节点更改时强制计算(Maya插件)

时间:2012-08-09 03:24:25

标签: python plugins maya

使用attributeAffects函数可以链接Maya节点的两个属性。例如,输入属性x可以链接到输出属性y。这意味着当x更改时,Maya将在给定节点上运行compute()回调函数,以计算y

但是,据我所知,只有节点本身的属性才能从插件内部连接起来。

在我的插件中,我扩展了MPxLocator,并输出属性out。我想做以下事情:

# replace <...> with transform node name.
attributeAffects(CustomNode.out, <custom node's tranform node>.translateX)
attributeAffects(CustomNode.out, <custom node's tranform node>.translateZ)

我找不到任何关于如何做到这一点的文档!有没有人做过/知道怎么做?有一种方法可以通过在脚本编辑器(python)中执行以下操作来解决这个问题:

import maya.cmds as cmds

# Creates CustomNode1, which is linked to transform1 in the DG.
cmds.createNode("CustomNode") 
cmds.connectAttr("transform1.translateX", "CustomNode.out")
cmds.connectAttr("transform1.translateZ", "CustomNode.out")

1 个答案:

答案 0 :(得分:4)

设计中的节点不应该知道其他节点。也就是说,如果节点具有所需的某些数据,那么该数据必须是内部的,或者在创建时或由用户连接。这使得Maya变得高效。并不是Maya实际上强制执行此操作,但忽略这个设计理念会让你非常不高兴,因为你一直在与Maya战斗(加上它更多,极易出错,需要维护的代码)。

所以这给你留下两个选择:

  • 创建2个输入属性并读取它们(在你的时候制作3,然后你就可以连接所有的翻译)。这种方法的好处是,现在任何Maya用户都可以做一些你对节点没有预期的事情。这是所有其他Maya节点的工作方式。大多数工厂节点提供用于创建节点的命令,以便它们可以连接到其余节点的预期连接。希望执行其他操作的用户始终可以使用 createNode 。如果你没有连接到out属性,那么这不是真正的黑客攻击。
  • 碰巧定位器节点已经知道其父节点的转换,以DAG节点继承属性 parentMatrix 的形式,现在这不是本地坐标父母的,但它在世界空间坐标。现在这也是Maya制作的连接,但它是一种隐藏的连接类型。*

这些是你唯一理智的选择。但如果你真的必须你也可以做你想要的事情,那么你将在优化一个Maya供应的免费性能之上进行自己的事件监控。它有一些额外的代码和更多的调试,而且它将在各方面都处于劣势。

PS:你的hack工作的原因是Maya以相反的方式评估连接,所以如果输出变脏并且要求Maya评估输出,那么Maya将触发计算

*就像时间一样,如果您创建一个名为时间类型的属性,那么Maya将为您连接它而不会询问和显示,除非您将其连接到其他内容。着色主要基于这些联系。