アトリビュート
アトリビュートとは
MAYAに存在するほとんどのオブジェクト(ノード)にはアトリビュートがついている。
このアトリビュートの値を設定・変更することによってモデリング・アニメーション・レンダリングなどを実行できるようになっている。
つまり、Maya上で行なわれる多くの操作はアトリビュートに関する操作である。
各アトリビュートには長い名前と短い名前がついている。
どちらでアクセスしても良い。
例えば、球(nurbsSphere1)などのトランスフォーム・ノードのX方向の移動値(translate X)には以下の2つのどちらでもアクセスすることができる。
- nurbsSphere1.translateX (長い名前)
- nurbsSphere1.tx (短い名前)
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スクリプトを作ってみよう。
- 以下の 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;
}
}
- Script Editorの → によって 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 に代入する。
球の名前を $name に代入するためにアサインを使用している。
この時、配列 $name には以下のように代入される。
- $names[0] にはトランスフォームノードの名前(nurbsSphere1など)
- $names[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"
という一つの文字列になる。
(MEL では + は複数の文字列を一つにまとめる演算子にもなる)
- 最終的に
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を加える。
練習
- 上の spiralObjects1.mel を参考にしてプロシージャーの引数を一つ増やし 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) の結果
まとめ
- MAYAではノードのアトリビュートを設定・コネクトすることによってモデリング・アニメーション・レンダリングを行う。
- アトリビュートの取得には getAttr 、設定には setAttr コマンドを使用する。
練習課題
参考
Prev | Next
Home | Contents
Mail