チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第80回:アトリビュートの付属情報を使いこなそう!

2019.10.17

  • Maya
  • ゲーム
  • スクリプト・API
  • チュートリアル
  • 中級者
第80回:アトリビュートの付属情報を使いこなそう!

addAttrコマンドでアトリビュートを作る時、doubleやfloat3などのアトリビュートの型を気にしながら作りますよね。実はそれ以外にも付属の情報というものがあるのにお気づきでしょうか?設定しなくてもMayaは動きますが、設定しておくとなにかと便利で、Mayaの動きに統一感が出ます。

今回はそんなアトリビュートの便利な設定について見ていきます。
(使用している画像が間違え探し並みに同じような画像ばかりですが、よく見るとスクリプトとアトリビュートエディタの内容が違いますので、よしなに。)

うすうす気づくカラーの設定

マテリアルの様にカラーのアトリビュートを作りたい時どうしていますか?
とりあえずlambert1のカラーを変えてみて、スクリプトエディタに何が表示されるか見てみましょう。

第80回:アトリビュートの付属情報を使いこなそう!

次のように表示されました。

setAttr "lambert1.color" -type double3 0.831169 0.831169 0.831169 ;

setAttr で -type double3 として値が設定されています。ということは、カラー値はdouble3で作られているということです。
次のようにaddAttrをdouble3で作成すれば、カラーのアトリビュートを作成できるはずです。

polyCube; // アトリビュートを追加するキューブ作ります
addAttr -ln "myColor" -dataType double3 pCube1;
第80回:アトリビュートの付属情報を使いこなそう!

アトリビュートエディタを見ると、Extra AttributesのところにMy Colorと表示されました。が、フィールドが出てきません…。
では、-dataTypeの代わりに-attributeTypeを使って次のように実行してみます。(よくあるおまじないのような手順)

polyCube;
addAttr -ln "myColor" -attributeType double3 pCube1;
第80回:アトリビュートの付属情報を使いこなそう!

今度はExtra Attributesに何も出なくなってしまいました。

おかしいなあと思い、addAttrのドキュメントを見てみます。
-attributeTypeでdouble3を作ると「doubleのアトリビュートを3つぶら下げられる親が出来る」だけですので、子もそれぞれ追加しないといけません。
次のようにしてRed/Green/Blueをdoubleとして追加します。

polyCube;
addAttr -ln "myColor" -attributeType double3 pCube1;
addAttr -ln "red" -attributeType double -parent "myColor";
addAttr -ln "green" -attributeType double -parent "myColor";
addAttr -ln "blue" -attributeType double -parent "myColor";
第80回:アトリビュートの付属情報を使いこなそう!

はい、無事にRGBのフィールドが出ました!
めでたし、めでたし。では次の内容に行きましょう…と、ここで安堵しては油断大敵です!

なぜかマテリアルのようなカラーの四角が出ないですよね。これは何かおかしいです。
実は、アトリビュートの付属情報によって、アトリビュートエディタに表示されるUIの種類が変わるのです!
addAttrには-usedAsColorというフラグがあります。このフラグを追加することで、ようやく「色のアトリビュート」として一人前になるのです。

次のように、アトリビュートに-usedAsColorフラグをつけて実行してみます。

polyCube;
addAttr -ln "myColor" -attributeType double3 -usedAsColor pCube1;
// Error: line 1: Color attributes must be one of '-at float3', '-dt reflectanceRGB', or '-dt spectrumRGB'. //


はい、エラーが出ました。なぜ?

エラーの内容を見ると「カラーのアトリビュートには-at float3、-dt reflectanceRGBか-dt spectrumRGBを使いなされ」と出ています。
Lambertにカラーを設定した時に出たsetAttrのdouble3に惑わされてしまいましたが、普通はカラーにはfloatを使う場合が多いので(doubleのような精度を求めない)、次のようにfloat3にして実行しましょう。(floatはMELのキーワードなので”で囲んで文字列にします。)

polyCube;
addAttr -ln "myColor" -attributeType float3 -usedAsColor pCube1;
addAttr -ln "red" -attributeType "float" -parent "myColor";
addAttr -ln "green" -attributeType "float" -parent "myColor";
addAttr -ln "blue" -attributeType "float" -parent "myColor";
第80回:アトリビュートの付属情報を使いこなそう!

ああ、めでたく無事にマテリアルのようなカラーの表示がされました。
このように-usedAsColorを設定すると、アトリビュートエディタの見た目もいい感じになります。カラーサンプル、リンクのボタンもあります。
ファイルをつなげるなど、自前で作成するのはとても大変なので、これは楽ですね。

アトリビュートを足しただけでは「なにか表示が怪しいぞ」と気付けるかどうかが運命の分かれ目です。

うすうす気づくファイル名の設定

Fileノードではテクスチャのパスを設定できます。同じ様にファイルパスを設定するために文字列のアトリビュートを作りたいとします。
次のようにして、polyCubeにstring型のアトリビュートを作ってみましょう。

polyCube;
addAttr -ln "myFile" -dataType "string" pCube1;
第80回:アトリビュートの付属情報を使いこなそう!

アトリビュートエディタを見ると、My Fileという名前でテキストのフィールドが表示されました。

さて、ファイルのパスを指定するためのダイアログ用ボタンが無いです。自分で作らないといけないのでしょうか。
ここで「Fileノードとなにか違うなー」とか「自分でファイルダイアログのボタン作るのは妙じゃないか」と感づいたなら、きっと次の瞬間にはaddAttrのドキュメントを開いていることでしょう。

そうです、アトリビュートの情報には-usedAsFilenameというのがあります。これを設定すると、アトリビュートがファイル名として扱われます。

polyCube;
addAttr -ln "myFile" -dataType "string" -usedAsFilename pCube1;
第80回:アトリビュートの付属情報を使いこなそう!

きちんとダイアログ用のボタンが表示されました。

ボタンを押せばファイルダイアログが出て、ファイルを選べばフィールドに入力されます。(ダイアログには画像ファイルのフィルタが付きます。)
しかも他にも恩恵があります。例えば「D:/test」など書いてエンターキーを押すと、自動的に見た目が「D:\test」となります。逆に「D:\test」と書くと、アトリビュート値としては「D:/test」に変換されます!

こうして追加の情報を設定したアトリビュートは、後からアトリビュートを見つけるときにも便利です。
listAttrでアトリビュートをリストアップする際、-usedAsFilenameフラグを使うと、ファイル名として使われているアトリビュートのみリストに出来ます。

listAttr -usedAsFilename;
// Result: templatePath iconName myFile //

GUIの見た目も良くなるし、情報を集める時も便利になるし、至るところで恩恵がありますので、ぜひ適切にアトリビュートの設定を行ってください。

プロキシアトリビュートの設定の挙動

Maya 2016.5あたりから、addAttrには-proxyフラグが追加されています。これもアトリビュートの付属の情報です。
普通はアトリビュートが二つあって、それぞれを接続すると、接続元だけ編集可能になります。
-proxyフラグを設定すると、アトリビュートが双方向で編集出来るようになります。

例えば次のようにトランスフォームを3つ作り、master、ctrlA、ctrlBとします。
それぞれにswitchというアトリビュートを作ります。ctrlA、Bにアトリビュートを作るときには-proxyフラグを使い、master.switchのプロキシとして作成します。

$master = `createNode -n "master" "transform"`;
$ctrlA = `createNode -n "ctrlA" "transform"`;
$ctrlB = `createNode -n "ctrlB" "transform"`;
addAttr -ln "switch" -at "bool" -keyable true $master;
addAttr -ln "switch" -proxy ( $master + ".switch") $ctrlA;
addAttr -ln "switch" -proxy ( $master + ".switch") $ctrlB;
第80回:アトリビュートの付属情報を使いこなそう!

図のように3つのトランスフォームが作成され、それぞれにswitchというアトリビュートが出来ます。
switchアトリビュートにコネクションが作成されています。どのswitchの値を変えてもお互いに値が変更されます。

さて、-proxyフラグを使うと何が起きるかというと、アトリビュートに「プロキシとして使うかどうか」が設定されます。
次のように照会するとusedAsProxyが設定されていることがわかります。

addAttr -q -usedAsProxy ($ctrlA + ".switch");
// Result: 1 //

さらに挙動の詳細をご紹介します。

いずれかのswitchアトリビュートに値が設定されると、Mayaはアトリビュートの接続情報を確認します。
普通であれば接続の入力・出力の関係があるので、出力側で値を設定することは出来ないのですが、usedAsProxyが設定されている場合は上流にさかのぼって値を変更します。

例えばキーフレームを打つと面白い結果が見られます。
ctrlBにキーフレームを打つと、次のようにさかのぼってmaster.switchにキーが打たれます。

第80回:アトリビュートの付属情報を使いこなそう!

この様に、何かあれば一番上流側のアトリビュートにさかのぼって値の変更やキーフレームの操作を行うことで、相互編集を可能にしています。

switch間の接続を削除するとどうなるのでしょうか?
ctrlA、Bのswitchアトリビュートには依然としてusedAsProxyが設定されているので、接続を作るとまた双方向でやり取りできる接続が作られます。
アトリビュートは型が合っていれば接続できますので、master.visibility -> ctrlB.switchとつなげると、visibilityとswitchが双方向の接続となります。

第80回:アトリビュートの付属情報を使いこなそう!

ちなみに、usedAsProxyはaddAttrから後で設定できないためAPIを介して変更することになります。
次のコードでは、ctrlB.switchのusedAsProxyをオフにしています。以後接続を作ると、普通の一方向の接続になります。

# Python API 2.0
import maya.api.OpenMaya as om
nodeAttr = 'ctrlB.switch'
selList = om.MSelectionList().add(nodeAttr)
plug = selList.getPlug(0)
attrFn = om.MFnAttribute(plug.attribute())
attrFn.isProxyAttribute = False

まとめ

今回は「usedAsColor」「usedAsFilename」「usedAsProxy」という3つのアトリビュートの設定について見てみました。数値の方だけでなく、これらの設定をうまく使うことでより快適にMayaを使いこなせることがおわかりいただけたのではないでしょうか?

しれーっと触れなかった、-attributeTypeと-dataTypeの違いについて軽くご紹介しておきましょう。
-dataTypeでdouble3など子のあるデータを作っても、アトリビュートとしてはdouble3という一つのアトリビュートになります。
-attributeTypeは、アトリビュートの追加の裏で色々とアレコレMayaが行っていますので、通常はユーザにとって使いやすいアトリビュートとして作成されます。

今回のように、どうしてもエラーなどがでて、どちらかのタイプしか使えないということもありますので、臨機応変に使い分けしてもらうのが良いです。

Maya Learning Channel
製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。