アトリビュート
アトリビュートとは
MAYAに存在するほとんどのオブジェクト(ノード)にはアトリビュートがついている。
このアトリビュートの値を設定・変更することによってモデリング・アニメーション・レンダリングなどを実行できる。
つまり、Maya上で行なわれる多くの操作はアトリビュートに関する操作である。
各アトリビュートには長い名前と短い名前がついている。
どちらでアクセスしても良い。
例えば、球(nurbsSphere)などのトランスフォーム・ノードの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, 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と同じ)
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を参考にしてプロシージャーの引数を一つ増やしtranslateYの増減値を変更できるMELスクリプトをspiralObjects2.melという名前で作ってみよう。
spiralObjects2(float $rad, int $num, float $iy)
spiralObjects2(5, 30, 0.2)の結果
- spiralObjects2.melを改良して spiralObjects3.melを作り、球(sphere)の代わりにcircleを使用してチューブになるようにしてみよう。
spiralObjects3(float $rad, int $num, float $iy)
(ヒント)
最期にselect -all;
とloft;
を行う。
spiralObjects3(5, 30, 0.4)の結果
まとめ
- MAYAではノードのアトリビュートを設定・コネクトすることによってモデリング・アニメーション・レンダリングを行う。
参考
Prev | Next
Home | Contents
abe@injapan.net