使用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")
答案 0 :(得分:4)
设计中的节点不应该知道其他节点。也就是说,如果节点具有所需的某些数据,那么该数据必须是内部的,或者在创建时或由用户连接。这使得Maya变得高效。并不是Maya实际上强制执行此操作,但忽略这个设计理念会让你非常不高兴,因为你一直在与Maya战斗(加上它更多,极易出错,需要维护的代码)。
所以这给你留下两个选择:
这些是你唯一理智的选择。但如果你真的必须你也可以做你想要的事情,那么你将在优化一个Maya供应的免费性能之上进行自己的事件监控。它有一些额外的代码和更多的调试,而且它将在各方面都处于劣势。
PS:你的hack工作的原因是Maya以相反的方式评估连接,所以如果输出变脏并且要求Maya评估输出,那么Maya将触发计算*就像时间一样,如果您创建一个名为时间类型的属性,那么Maya将为您连接它而不会询问和显示,除非您将其连接到其他内容。着色主要基于这些联系。