3

関数を使用してattributeAffects、Maya ノードの 2 つのアトリビュートをリンクできます。たとえば、入力属性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つのオプションがあります。

  • 2 つの入力属性を作成し、それらを読み取ります (その間に 3 つ作成すると、すべての変換を接続できます)。このアプローチの利点は、Maya ユーザがノードで予期しないことを実行できるようになったことです。これは、他のすべての Maya ノードがどのように機能するかです。ほとんどのファクトリ ノードは、ノードを作成するためのコマンドを提供するため、予想される接続を残りのノードに接続できます。他のことをしたいユーザーは、いつでもcreateNodeを使用できます。したがって、 out 属性に接続しない場合、これを行うのは実際にはハックではありません。
  • ロケータノードは、DAG ノードから継承されたアトリビュートparentMatrixの形式で、その親のトランスフォームをすでに知っていることがあります。これは、親のローカル座標ではなく、ワールド空間座標です。これも Maya が作成する接続ですが、非表示の接続タイプです。*

それらはあなたの唯一の正気の選択肢です。ただし、本当に必要な場合は、要求どおりに実行することもできますが、Maya が提供する無料のパフォーマンス最適化に加えて、独自のイベント監視を行うことになります。少し余分なコードがあり、あなたの側でより多くのデバッグが必要であり、あらゆる点で劣っています。

PS: ハックが機能する理由は、Maya が作成された接続とは逆の方法で接続を評価するためです。そのため、出力をダーティにし、Maya が出力を評価するように求められた場合、Maya は計算を開始します。

*時間と同じように、time という名前のアトリビュートを time タイプにすると、他の何かに接続しない限り、Maya は確認も表示もせずに接続します。シェーディングは主にこれらの接続に基づいています。

于 2012-08-11T20:28:51.647 に答える