MayaでExtraAttributeを楽に使いたい

INDEX

はじめに

こんにちは。モノリスソフト テクニカルアーティストの菅原です。

Mayaでワークフローに則った作業を行う際など、ExtraAtrtibuteに必要な各種情報を設定することがよくあります。
個人的にExtraAttribute周りの処理は煩雑になりがちで、何か良い方法は無いかと探していたところ(devkitが必要ですが一応)Maya標準で良さそうな機能があったためその検証と簡単なツール作成を行いました。

アトリビュートパターンを使用してアトリビュートを作成する

基本的にはMayaヘルプにあるこちらのページの内容になります。
アトリビュート パターンを使用してアトリビュートを作成する

ExtraAttributeを定義したJsonファイルをpyJsonAttrPatternFactory.pyプラグインを有効にした状態のcreateAttrPatternsコマンドで読み込み、applyAttrPatternコマンドで実在ノード or ノードタイプに適用することでExtraAttributeが追加できます。

Jsonファイルでkeyable・hidden等のFlagも含めたExtraAttributeの定義ができるので、使用用途ごとにあらかじめパターンをいくつか用意しておき、選択したノードにパターンを適用 or 別のパターンに切り替えるといったことができそうです。

サンプルの定義ファイル

C:\Program Files\Autodesk\Maya2019\devkit\plug-ins\scripted\sampleAttrPatterns.json

ノードタイプへのアトリビュートパターンの適用について

ノードタイプへアトリビュートパターンを適用することで既にシーン上に存在する同タイプのノードへExtraAttributeが追加 + 以降同タイプのノード生成と同時にExtraAttributeが追加されるようになります。

これはこれで便利かもしれませんが、この方法でExtraAttributeを追加したノードが含まれるシーンファイルを開いた時にアトリビュートパターンが読み込まれていない場合、アトリビュートパターンで適用したExtraAttributeの情報が全て消えてしまうようでした。

今回は環境でアトリビュートパターンの読み込みを担保する部分については考慮せず、通常のノードに対してアトリビュートパターンを適用することでExtraAttributeを追加する方法のみ詳しく検証していきます。

アトリビュートパターンに関連するコマンドの注意点

アトリビュートパターンに関連するコマンドを触っていくうちに、いくつか注意するべき部分がわかったので以下にまとめようと思います。
各コマンドの引数などについてはMaya公式のMELコマンドリファレンスを参照してください。

createAttrPatterns

同じJsonファイルの読み込みを複数回実行するとその数だけ同名のアトリビュートパターンが作成される

後述のアトリビュートパターン削除処理(deleteAttrPatternコマンド)が不安定のように見えるので同名・別パターンのアトリビュートパターンを読み込む可能性がある場合は気を付ける必要があります。

applyAttrPattern

同じアトリビュートパターンの適用を複数回実行するとその数だけ同名のExtraAttributeが追加される

通常addAttrでExtraAttributeを追加しようとした時に既に同名のExtraAttributeが存在している場合はエラーを返しますが、applyAttrPatternコマンドを使用してExtraAttributeを追加した場合はエラーを返しません。

AttributeEditorでは問題ないように見えますが、NodeEditorで確認すると同名ExtraAtrtibuteが追加されていることがわかります。
また、複数追加された同名ExtraAtrtibuteが参照している値は全て同じになるようでした。

tech_29_02.png

複数追加されたExtraAtrtibute

tech_29_03.png

NodeEditor側から確認した値は全て同じになっている

対象ノードの標準Attribute(tranlate・rotate・scale等)と同名のExtraAttributeが追加できてしまう

「同じアトリビュートパターンの適用を複数回実行するとその数だけ同名のExtraAttributeが作成される」と内容はほぼ同じになりますが、アトリビュートパターンに標準Attributeと同名のExtraAttributeが定義されていた場合でもapplyAttrPatternで適用できてしまいます。
この時問題になるのが、シーンファイル保存後に再度シーンを開くとExtraAttributeの値が標準Attributeの値として扱われることです。

この問題回避のため、Jsonファイルにアトリビュートパターンを定義する際にはAttributeの名前が重複しないようにPrefixを追加するというルールにしておいてもよいかもしれません。

tech_29_04.png

ExtraAttribute追加後シーンファイル保存後

tech_29_05.png

上記シーンファイル再読み込み後

deleteAttrPattern

コマンドを実行してアトリビュートパターンを削除した後にNewScene・OpenSceneを実行するとMayaが落ちる

※これについては環境によって差がある可能性があります。

アトリビュートパターンが読み込まれていない状態でdeleteAttrPatternコマンドを実行した場合は、その後問題なくNewScene・OpenSceneが実行できるようですが、deleteAttrPatternコマンド実行により実際にアトリビュートパターンを削除した後はNewScene・OpenSceneでMayaが落ちるという現象が確認できました。

そのため今回は、deleteAttrPatternコマンドを使用しないツールとしました。

作成したツール

今回はパターンをダイアログから選択してノードに適用 or 別のパターンに切り替えるツールを作成しました(monolithtech_attr_pattern.zip 4.18 KB)。
別のパターンに切り替える時には一旦ExtraAttributeをすべて削除してから適用し直す形になっています。

DOWNLOAD

実行方法

ダウンロードした上記ファイルを解凍し、Documents\maya\2019\scripts等のスクリプトパスが通っている場所に置いてください。
その後、Mayaのスクリプトエディタから以下を実行することで起動できます。

import techblog_attr_pattern
techblog_attr_pattern.AttrPatternManager().show()

tech_29_01_06.gif

まとめ

今回はMayaのアトリビュートパターンの検証と簡単なツール作成を行ってみました。
コマンドの挙動が少し不安でしたがツールとしては色々と拡張できそうな物になったので、アトリビュートパターンについては引き続き検証を進めたいと思います。

Mayaでツールを作る際の作成の参考になれば幸いです。

参考

アトリビュート パターンを使用してアトリビュートを作成する、Autodesk
https://help.autodesk.com/view/MAYAUL/2019/JPN/?guid=GUID-B103DD61-8ED8-440E-AB55-64F70E09F7D3

執筆者:菅原

インタラクティブコンテンツ制作会社を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にMayaツール開発の業務を担当。 好きな食べものはごはん。

ABOUT

モノリスソフト開発スタッフが日々取り組んでいる技術研究やノウハウをご紹介

RECRUIT採用情報