3

使用该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")
4

1 回答 1

4

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

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

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

这些是您唯一明智的选择。但是,如果您真的必须这样做,您也可以按照您的要求进行操作,但是您将在免费的性能优化 Maya 用品的基础上进行自己的事件监控。它有一些额外的代码和更多的调试,而且它在所有方面都会逊色。

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

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

于 2012-08-11T20:28:51.647 回答