アトリビュート
アトリビュートとは
Maya 上のモデリング・アニメーション・シェーディングは、
作成したオブジェクト(ノード)のアトリビュート値を設定・変更することによって進めてゆきます。
つまり、Maya 上で行なわれる多くの操作はアトリビュートに関する操作なので、
MEL においてもアトリビュートの扱いは重要です。
MEL でアトリビュートの設定・変更を行う場合は、ノード名とアトリビュート名が必要です。
ノード名とアトリビュート名の間には . (ピリオド)を入れて記述します。
たとえば、「camera1 という名前のノードの tx アトリビュート」を表す名前は
camera1.tx と記述します。
アトリビュート名は、チャンネルボックスなどには日本語で表示されていますが、
MEL でアクセスするには英数字の名前を使用します。
アトリビュートには、長い名前と短い名前がついています。
MEL では、どちらでもアクセスできます。
たとえば、NURBS の球体を作成すると作られる nurbsSphere1 などのトランスフォームノードには、
X 方向の移動値を表す 移動X というアトリビュートがあります。
このアトリビュートには、以下のどちらの名前でもアクセスすることができます。
- nurbsSphere1.translateX (長い名前)
- nurbsSphere1.tx (短い名前)
アトリビュートに設定できる値は、それぞれのアトリビュートの種類によって決まっています。
アトリビュートの種類についてはアトリビュートのデータタイプの表を参照してください。
アトリビュートの種類
アトリビュートには、以下の種類があります。
- スタティックアトリビュート
- ノードに始めからついているアトリビュートです。
たとえば、 NURBS の球体を作成した時に作られるトランスフォームノードの translateX(移動X)アトリビュートなどです。
- ダイナミックアトリビュート
- 後からノードに追加して使用するアトリビュートです。
アトリビュート名と、その役割はノードごとに決められています。
- カスタムアトリビュート
- ユーザーが名前と型を決めて、後から追加するアトリビュートです。
アトリビュートの名前
ひとつのアトリビュートに対して、以下の 3 種類の名前がついています。
カスタムアトリビュートなどでは、短い名前がないものもあります。
- ロングネーム(長い名前)
- translateX, roateY, scaleZ などの長い名前です。
- ショートネーム(短い名前>)
- tx, ry, sz などの短い名前です。
- ナイスネーム
- 読みやすく意味のわかりやすい名前です。
移動X、 回転Y、 スケールZ などです。
Tips
チャンネルボックスや、アウトライナなどに表示されているアトリビュート名は、
デフォールトでナイスネームになっていますが、
以下のメニューで、ロングネームやショートネームに変更することができます。
Mayaの内部構造
Maya では、
GUI・MEL などによってモデリング・アニメーション・シェーディングなどの操作を行なうと、以下の操作の全部、または一部が実行されます。
- ノードの作成
- 必要ならば親ノードを設定
- ノードのアトリビュートに値を設定
- ノード同士のアトリビュートをコネクト
Maya は、このノードとアトリビュートに関する 4 種類の操作だけで、
モデリング・アニメーション・シェーディングを行なう非常にシンプルなシステムです。
しかし、これだけでは非効率なので、効率良く便利に操作するために
GUI のメニューや MEL のコマンドなどが作られています。
アトリビュートを扱うためのコマンド
アトリビュートをあつかうためのコマンドには、以下のようなものがあります。
- getAttr ノード名.アトリビュート名
- アトリビュートの値を得ます。
詳しい解説は「アトリビュートの値の取得」を参照してください。
- setAttr ノード名.アトリビュート名 アトリビュートの値
- アトリビュートの設定します。
詳しい解説は「アトリビュートの値の設定」を参照してください。
- listAttr ノード名
- ノードに存在するアトリビュート名をリスト表示します。
- connectAttr ノード名1.アトリビュート名1 ノード名2.アトリビュート名2
- アトリビュートのコネクトをします。
ノード 1 のアトリビュート 1 を、ノード 2 のアトリビュート 2 にコネクトします。
- disconnectAttr ノード名1.アトリビュート名1 ノード名2.アトリビュート名2
- アトリビュートのコネクトを切り離します。
ノード 2 のアトリビュート 2 にコネクトされている、ノード 1 のアトリビュート 1 を切り離します。
- aliasAttr アトリビュート別名 ノード名.アトリビュート名
- アトリビュートに別名をつけます。
別名をつけても元の名前もそのまま使えます。
また、別名は 1 つしか付けられないので、
すでに別名が付けられているアトリビュート名に、新しく別名を付けると古い別名は無くなります。
- aliasAttr -remove ノード名.アトリビュート別名
- アトリビュートの別名を取り消します。
または、以下のように元のアトリビュート名でも取り消すことができます。
aliasAttr -remove ノード名.アトリビュート名
- addAttr -longName 長いアトリビュート名 -shortName 短いアトリビュート名 -dt データ型 -at アトリビュート型 -min 最小値 -max 最大値 ノード名
- ダイナミックアトリビュートや、カスタムアトリビュートをノードに追加します。
このコマンドを使用する場合は、最低限「長いアトリビュート名」か「短いアトリビュート名」が必要です。
「データ型」「アトリビュート型」についてはアトリビュートのデータタイプの表を参照してください。
- deleteAttr ノード名.アトリビュート名
- ダイナミックアトリビュートを削除します。
スタティック アトリビュートは削除できません。
以下の例では、 getAttr コマンドによってアトリビュートの値を得て、
変数に代入する方法を解説します。
- ノード名 nurbsSphere1 の移動X をあらわすアトリビュート translateX (短い名前は tx)を、変数に代入したい時は以下のように実行します。
float $tx = `getAttr nurbsSphere1.tx`;
- ある string (文字列)の変数に名前が代入されているノードのアトリビュートを、他の変数に代入する時は以下のように実行します。
$変数名 = `getAttr $変数名.アトリビュート名`;
または、
$変数名 = `getAttr ($変数名 + ".アトリビュート名")`;
これらは、場合によって使い分けます。
以下のコマンドは、
ノード名 nurbsSphere1 のアトリビュート translateY (tx) の値を、変数 $ty に代入するものです。
string $name = "nurbsSphere1";
float $ty = `getAtrr $name.ty`;
- sphere コマンドなどで作られたノードの名前を変数に代入し、
そのノードのアトリビュートを得たい場合は以下のように実行します。
string $sname[] = `sphere`;
float $tz = `getAttr ($sname[0] + ".tz")`;
この場合、
float $tz = `getAttr $sname[0].tz`;
ではエラーになることに注意してください。
Tips
あるノードの複数のアトリビュートの値を得たい場合には、以下のように最初にノードを選択しておくと、ノード名を省略することができます。
select nurbsSphere1;
getAttr .tx;
getAttr .ty;
getAttr .tz;
以下の例では、 setAttr コマンドによって、アトリビュートの値を設定する方法を解説します。
- ノード名 nurbsSphere1 のアトリビュート translateX (短い名前は tx)に値(2.5)を設定したい場合は、
以下のように実行します。
setAttr nurbsSphere1.tx 2.5;
- ある string (文字列)の変数に名前が代入されているノードのアトリビュートに値を設定する場合は、
以下のように実行します。
string $name = "nurbsSphere1";
setAttr ($name + ".tx") 2.5;
- sphere コマンドなどで作られたノードの名前を変数に代入し、
そのノードのアトリビュートに値を設定したい場合は、 以下のように実行します。
string $sname[] = `sphere`;
setAttr ($sname[0] + ".ty") 2.5;
この場合、
setAttr $sname[0].ty 2.5;
ではエラーになることに注意してください。
Tips
あるノードの複数のアトリビュートに値を設定したい場合には、以下のように最初にノードを選択しておくと、ノード名を省略することができます。
select nurbsSphere1;
setAttr .tx 2.5;
setAttr .ty 3.0;
setAttr .tz 5.2;
アトリビュートの例
アトリビュートに値を設定する方法によって、球体を螺旋(らせん)上に並べる MEL スクリプトを作ってみましょう。
- 以下の MEL スクリプトを spiralObjects1.mel という名前で作ります。
global proc spiralObjects1(float $rad, int $num)
{
int $i;
float $r = 0.0;
float $y = 0.0;
string $name[];
for($i = 0; $i < $num; $i++)
{
$name = `sphere`;
setAttr ($name[0] + ".tx") $rad;
rotate -ws -p 0 0 0 0 $r 0;
setAttr ($name[0] + ".ty") $y;
$r += 30.0;
$y += 0.5;
}
}
- スクリプト エディタ の → によって spiralObjects1.mel を読み込みます。
- スクリプト エディタ のインプットウインドウに spiralObjects1(5.0, 30) と打ち込んで実行します。
- 半径 5 の螺旋状に球体が 30 個並びます。
スクリプトの解説
global proc spiralObjects1(float $rad, int $num)
- 引数として $rad (円の半径の値)と $num (球体の個数)をとるプロシージャの宣言です。
int $i;
- for 文のカウンタとして使うための変数の宣言です。
float $r = 0.0;
- 球体の回転角度を入れておく変数の宣言です。
float $y = 0.0;
- 球体の高さ(translateY)を入れておく変数の宣言です。
string $name[];
- 球体の名前を入れておくための string (文字列)の配列の宣言です。
for($i = 0; $i < $num; $i++)
- $num 回 for ループを実行します。
以下は、for ループ内の処理の解説です。
$name = `sphere`;
- NURBS の球体を作成し、その時作られるノードの名前を配列 $name に代入します。
作られるノードは複数(この場合は 2 個)なので、配列にしておく必要があることに注意してください。
球体の名前を $name に代入するために、
アサインを使用しています。
このとき、配列 $name には以下のように代入されます。
- $name[0] にトランスフォームノードの名前(nurbsSphere1など)
- $name[1] に球体を作るインプットノードの名前(makeNurbsSphere1など)
setAttr ($name[0] + ".tx") $rad;
- $name[0] (球体のトランスフォームノード)のアトリビュート(tx)に値 $rad を設定します。
(move $rad 0 0 と結果は同じになります)
このコマンドは、以下のような順序で実行されます。
- まず $name[0] の部分が、球体の名前を表す文字列になります。
たとえば "nurbsSphere1" になるとします。
- ($name[0] + ".tx") の括弧の中が
"nurbsSphere1" + ".tx"
と展開されます。
そして、文字列を連結する演算子 + によって
"nurbsSphere1.tx"
という 1 つの文字列になります。
(MEL では + は左右の文字列を連結して 1 つの文字列にする演算子になります)
- 最終的に
setAttr nurbsSphere1.tx $rad;
が実行されます。
rotate -ws -p 0 0 0 0 $r 0;
- 移動された球体を、
ワールド空間内で(0, 0, 0)を中心として Y 軸周りに $r だけ回転します。
各フラグの意味は、以下の通りです。
- -ws
- ワールド空間で回転させます。
- -p 0 0 0
- 回転の中心は(0, 0, 0)
- 0 $r 0
- X 軸周りに 0 度、Y 軸周りに $r 度、Z 軸周りに 0 度回転させます。
setAttr ($name[0] + ".ty") $y;
- $name[0] (球体のトランスフォームノード)のアトリビュート(ty)に $y を設定します。
(move 0 $y 0 と結果は同じになります)
$r += 30.0;
- 球体の回転角度に30.0を加えます。
$y += 0.5;
- 球体の translateY の値に0.5を加えます。
MEL スクリプト作成時の注意
ここで、MEL スクリプトを作るときに間違えやすい点、
注意すべき点を挙げてみましょう。
練習
- 上の spiralObjects1.mel を参考にしてプロシージャの引数を 1 つ増やし
translateY の増減値を引数 $iy で変更できる MELスクリプトを、
spiralObjects2.mel という名前で作ってみましょう。
spiralObjects2(float $rad, int $num, float $iy)
spiralObjects2(5.0, 30, 0.2) の結果
- spiralObjects2.mel を参考にして spiralObjects3.mel を作り、球体(sphere)の代わりに circle を使用してチューブになるようにしてみましょう。
spiralObjects3(float $rad, int $num, float $iy)
(ヒント)
最後に select -all; と loft; を実行します。
spiralObjects3(5.0, 30, 0.4) の結果
(応用)
ヒントでは、実行時に他のオブジェクトが存在しないという前提で、
MEL コマンド(select -all; と loft;)を実行します。
しかし、spiralObjects3 を実用的なスクリプトにするためには、
実行前にオブジェクトが作られていても、loft が正常に実行される必要があります。
そうなるように、スクリプトを改良してみてください。
まとめ
- Maya ではノードのアトリビュートを設定・コネクトすることによって、モデリング・アニメーション・レンダリングを行います。
- アトリビュートの取得には getAttr 、設定には setAttr コマンドを使用します。
練習課題
参考
Prev | Next
Home | Contents
Mail