2012-08-09 43 views
3

使用attributeAffects函數可以鏈接Maya節點的兩個屬性。例如,輸入屬性x可以鏈接到輸出屬性y。這意味着當更改x時,Maya將在給定節點上運行compute()回調函數,以計算y轉換節點更改時強制計算(Maya插件)

但是,據我所知,只有節點本身上的屬性才能從插件內部這樣連接。

在我的插件中,我擴展了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) 

我找不到任何有關如何做到這一點的文檔!有沒有人做過/知道如何?有一種方法在腳本編輯器(蟒蛇)執行以下操作來破解這樣的:

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

通過設計一個節點不應該知道其他節點。也就是說,如果節點有一些需要的數據,那麼數據需要在內部,或者在創建時或由用戶連接。這就是導致Maya高效的原因。它並不是說Maya實際上實施了這個,但忽略這個設計理念會讓你非常不高興,因爲你一直與Maya對抗(加上它更多,極易出錯,代碼維護)。

因此,這讓你有2種選擇:

  • 創建2輸入屬性和閱讀這些(讓3,而你在它,那麼你可以連接所有的翻譯)。這種方法的好處是,現在任何Maya用戶都可以做你沒有想到的節點。這就是所有其他Maya節點的工作原理。大多數工廠節點提供一個命令來製作節點,以便將預期的連接連接到其餘節點。希望執行其他操作的用戶始終可以使用createNode。所以不,如果你沒有連接到out屬性,這並不是真正的黑客行爲。
  • 恰巧在定位節點已經知道其父的改造,DAG中的節點繼承屬性parentMatrix的形式,現在這不是父母的本地座標,但其在世界空間座標。現在,這也是Maya創建的一個連接,但它是一種隱藏連接類型。*

這些是您唯一的理智選擇。但是,如果您確實需要,您還可以按照您的要求進行操作,但是您可以在優化一個Maya提供的免費性能的基礎上進行自己的事件監控。它有一些額外的代碼和更多的調試,而且它會在所有方面都較差。

PS:爲什麼你的黑客工作的原因是瑪雅評估的聯繫,他們均採用相反的方式,因此,如果您使輸出髒和Maya被要求評價輸出,那麼瑪雅將火計算

*就像時間一樣,如果您創建了一個名爲時間類型的屬性,那麼Maya會在不詢問和顯示的情況下爲您連接它,除非將其連接到其他位置。陰影主要基於這些連接。

+0

很好的回答。我不太清楚Maya節點背後的語義,但現在對我來說這更清晰 - 你說的話很有意義。 謝謝! – rykardo 2012-08-12 03:27:26

+0

還有一件事可以讓你知道。如果你正確地組織你的代碼,那就是你只計算每個請求的最小數量的插槽,即使在內部時也是m輸入和輸出。這意味着您檢查Maya要求的內容。然後,您可以創建一個緩存結果而無需執行此操作的節點,並且它總是以正確的順序進行評估。它允許你在節點內部計算之間注入不同的節點。您可以使用許多Maya工廠節點(如運動路徑方位計算)來執行此操作,即使所有計算都在節點內部進行。所以節點中的節點。 – joojaa 2012-08-12 18:19:54