アトリビュート

アトリビュートとは

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

各アトリビュートには長い名前と短い名前がついている。
どちらでアクセスしても良い。
例えば、球(nurbsSphere1)などのトランスフォーム・ノードのX方向の移動値(translate X)には以下の2つのどちらでもアクセスすることができる。

Mayaの内部構造

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

この3つがMAYAにおいてモデリング、アニメーションを行なう時に行なわれていることの、ほとんどすべてと言って良い。
GUIやほとんどのMELのコマンドなどは、これらの操作を効率良く、便利に行なうために存在している。

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

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

getAttr オブジェクト名.アトリビュート名
アトリビュートの値を得る
setAttr オブジェクト名.アトリビュート名 アトリビュートの値
アトリビュートの設定
listAttr オブジェクト名
アトリビュートのリスト表示
connectAttr オブジェクト名1.アトリビュート名1 オブジェクト名2.アトリビュート名2
アトリビュートの接続
アトリビュート1をアトリビュート2に接続する。
disconnectAttr オブジェクト名1.アトリビュート名1 オブジェクト名2.アトリビュート名2
アトリビュートの接続を切り離す
aliasAttr アトリビュート別名 オブジェクト名.アトリビュート名
アトリビュートに別名をつける
aliasAttr -remove オブジェクト名.アトリビュート別名
アトリビュートの別名を取り消す
または
aliasAttr -remove オブジェクト名.アトリビュート名
addAttr -longName 長いアトリビュート名 -shortName 短いアトリビュート名 -min 最小値 -max 最大値 オブジェクト名
アトリビュートを追加する。
deleteAttr オブジェクト名.アトリビュート名
アトリビュートを削除する。

アトリビュートの例

アトリビュートに値を設定する方法によって球を螺旋上に並べる 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. コマンドラインから 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 に代入する。
球の名前を $name に代入するためにアサインを使用している。
この時、配列 $name には以下のように代入される。
  • $names[0] にはトランスフォームノードの名前(nurbsSphere1など)
  • $names[1] には球を作るノードの名前(makeNurbsSphere1など)
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