アトリビュート

アトリビュートとは

MAYA に存在するオブジェクト(ノード)にはアトリビュートがついていて、 このアトリビュートの値を設定・変更することによってモデリング・アニメーション・レンダリングなどができるようになっています。
つまり、Maya 上で行なわれる多くの操作はアトリビュートに関する操作なので MEL においてもアトリビュートの扱いは重要です。

MEL でアトリビュートにアクセスする場合は ノード名とアトリビュート名が必要です。
アクセスする時はノード名とアトリビュート名の間を . (ピリオド)ではさみます。 例えば、camera1.tx などのように使用します。
アトリビュートには長い名前と短い名前がついているものがありますが、 その場合はどちらでもアクセスできます。
例えば、NURBS の球を作成すると作られる nurbsSphere1 などのトランスフォームノードの X 方向の移動値を表す translate X には以下のどちらの名前でもアクセスすることができます。

アトリビュートの種類についてはアトリビュートのデータタイプの表を参照してください。

Mayaの内部構造

MAYA において GUI・MEL などを使ってモデリング・アニメーション・シェーディングなどの操作を行なうと以下の操作の全部、または一部が実行されます。

MAYA は、この 3 種のノードとアトリビュートに関する操作だけでモデリング・アニメーション・シェーディングを行なう非常にシンプルなシステムです。
しかし、これだけでは非効率なので、効率良く便利に操作するために GUI のメニューなどや MEL のコマンドが作られています。

アトリビュートを扱うためのコマンド

アトリビュートをあつかうためのコマンドには以下のようなものがあります。

getAttr ノード名.アトリビュート名
アトリビュートの値を得ます。
詳しい解説は「アトリビュートの値の取得」を参照してください。
setAttr ノード名.アトリビュート名 アトリビュートの値
アトリビュートの設定します。
詳しい解説は「アトリビュートの値の設定」を参照してください。
listAttr ノード名
ノードに存在するアトリビュート名をリスト表示します。
connectAttr ノード名1.アトリビュート名1 ノード名2.アトリビュート名2
アトリビュートの接続をします。
ノード 1 のアトリビュート 1 をノード 2 のアトリビュート 2 に接続します。
disconnectAttr ノード名1.アトリビュート名1 ノード名2.アトリビュート名2
アトリビュートの接続を切り離します。
ノード 2 のアトリビュート 2 に接続されているノード 1 のアトリビュート 1 を切り離します。
aliasAttr アトリビュート別名 ノード名.アトリビュート名
アトリビュートに別名をつけます。
別名をつけても元の名前もそのまま使えます。 また、別名はひとつしか付けられないので、 すでに別名が付けられているアトリビュート名に新しく別名を付けると古い別名は無くなります。
aliasAttr -remove ノード名.アトリビュート別名
アトリビュートの別名を取り消します。
または、以下のように元のアトリビュート名でも取り消すことができます。
aliasAttr -remove ノード名.アトリビュート名
addAttr -longName 長いアトリビュート名 -shortName 短いアトリビュート名 -dt データ型 -at アトリビュート型 -min 最小値 -max 最大値 ノード名
ダイナミックアトリビュートを追加します。
ノードにダイナミックアトリビュートを追加したい時に使用します。
このコマンドを使用する場合は、最低限「長いアトリビュート名」か「短いアトリビュート名」が必要です。
「データ型」「アトリビュート型」についてはアトリビュートのデータタイプの表を参照してください。
deleteAttr ノード名.アトリビュート名
ダイナミックアトリビュートを削除します。
元からあるアトリビュート、例えば NURBS の球を作成した時に作られるトランスフォームノードの translateX などは削除できません。

アトリビュートの値の取得

以下の例では getAttr コマンドによってアトリビュートの値を得て、変数に代入する方法を解説します。

Tips

あるノードの複数のアトリビュートの値を得たい場合には、以下のように最初にノードを選択しておくと、ノード名を省略することができます。

select nurbsSphere1;
getAttr .tx;
getAttr .ty;
getAttr .tz;

アトリビュートの値の設定

以下の例では setAttr コマンドによってアトリビュートの値を設定する方法を解説します。

Tips

あるノードの複数のアトリビュートに値を設定したい場合には、以下のように最初にノードを選択しておくと、ノード名を省略することができます。

select nurbsSphere1;
setAttr .tx 2.5;
setAttr .ty 3.0;
setAttr .tz 5.2;

アトリビュートの例

アトリビュートに値を設定する方法によって、球を螺旋上に並べる MEL スクリプトを作ってみましょう。

  1. 以下の 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;
    	}
    }
    
  2. Script Editor の FileSource Script によって spiralObjects1.mel を読み込みます。
  3. Script Editor のインプットウインドウに spiralObjects1(5.0, 30) と打ち込んで実行します。
  4. 半径 5 の螺旋状に球が 30 個並びます。
    [spiralObjects1(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++)
$numfor ループを実行します。
以下は for ループ内の処理の解説です。
$name = `sphere`;
NURBS の球を作成し、その時作られるノードの名前を配列 $name に代入します。
作られるノードは複数(この場合は 2 個)なので、配列にしておく必要があることに注意してください。
球の名前を $name に代入するためにアサインを使用しています。
この時、配列 $name には以下のように代入されます。
setAttr ($name[0] + ".tx") $rad;
$name[0] (球のトランスフォームノード)のアトリビュート(tx)に値 $rad を設定します。 (move $rad 0 0 と結果は同じになります)
このコマンドは以下のような順番で実行されます。
  1. まず $name[0] の部分が球の名前を表す文字列になります。
    例えば "nurbsSphere1" になるとします。
  2. ($name[0] + ".tx") の括弧の中が
    "nurbsSphere1" + ".tx"
    と展開されて文字列を連結する演算子 + によって "nurbsSphere1.tx" という一つの文字列になります。 (MEL では + は複数の文字列を一つにまとめる演算子にもなります)
  3. 最終的に 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 -r 0 $y 0 と結果は同じになります)
$r += 30.0;
球の回転角度に30.0を加えます。
$y += 0.5;
球の translateY の値に0.5を加えます。

練習

まとめ

練習課題

参考


Prev | Next
Home | Contents
Mail