Q100136: 手続き型ワークフローを利用してOpScriptでシーングラフの場所間で属性をコピーする方法

まとめ

この記事では、OpScript ノードを使用してシーン グラフの場所間で属性をコピーする方法について説明します。

詳細情報

Katanaで作業する場合、SetAttribute ノードを使用してロケーションの属性を簡単に設定できます。ただし、あるロケーションに設定されている属性を別のロケーションにコピーしたい場合は、OpScript ノードと数行のコードを使用することで実現できます。

名前は同様の機能を示唆していますが、 AttributeCopyノードはこの目的では使用できません。

AttributeCopy は、fromRoot の位置にある copyFrom シーンと、toRoot の位置にある入力シーンを走査します。これらの位置以降では、同一の階層と位置名が見つかるものと想定されます。
属性コピーSS.png
つまり、属性をコピーする2つの場所のすべての子ノードは、同じ階層構造と名前を持つ必要があります。これにより、AttributeCopyノードは正しい属性を正しい場所にコピーできるようになります。
このノードがこのように動作する理由は、変更された異なるノード グラフ内のシーン間で属性をコピーするように設計されているが、同じアセットを使用するため、シーン グラフの階層と場所の名前は同一であるからです。
同じシーングラフ内の場所間で属性をコピーするには、 CopyAttr()コマンドを使用する OpScript を使用します。これは次のように実行できます。
1) OpScript ノードを作成し、そのapplyWhereパラメータをat locations matching CELに設定します。
2) attrFromattrTosourceLocationという3つのユーザーパラメータを追加します。ノードにユーザーパラメータを追加する方法については、 Katanaユーザーガイドの「ユーザーパラメータの追加」セクションを参照してください。
3) sourceLocationパラメータの値は、属性コピー元となるシーングラフの場所へのパスである必要があります。
4) CEL ステートメントは、属性コピーするシーン グラフの場所へのパスである必要があります。
5) attrFromテキスト フィールドコピー元の属性の名前を入力します。
6) コピー先の属性の名前attrToパラメータ値として追加します。
7) OpScript ノードのScriptパラメータに次の lua コードを追加します。
 local attrFrom = Interface.GetOpArg("user.attrFrom"):getValue()
local attrTo = Interface.GetOpArg("user.attrTo"):getValue()
local sourceLocation = Interface.GetOpArg("user.sourceLocation"):getValue()
Interface.CopyAttr(attrTo, attrFrom, true, sourceLocation)

この方法はローカル属性をソースとする場合にのみ機能します。コピーしたい属性が親ロケーションから継承されている場合は、最後の行を次のように変更する必要があります。
 Interface.SetAttr(attrTo, Interface.GetGlobalAttr(attrFrom, sourceLocation))

    私たちはそれを聞いて申し訳ございません

    理由をお聞かせください