アトリビュート
アトリビュートとは
MAYA に存在するオブジェクト(ノード)にはアトリビュートがついていて、
このアトリビュートの値を設定・変更することによってモデリング・アニメーション・レンダリングなどができるようになっています。
つまり、Maya 上で行なわれる多くの操作はアトリビュートに関する操作なので
Python においてもアトリビュートの扱いは重要です。
Python でアトリビュートにアクセスする場合は
ノード名とアトリビュート名が必要です。
アクセスする時はノード名とアトリビュート名の間を . (ピリオド)ではさみます。
例えば、camera1.tx などのように使用します。
アトリビュートには長い名前と短い名前がついているものがありますが、
その場合はどちらでもアクセスできます。
例えば、NURBS の球を作成すると作られる nurbsSphere1 などのトランスフォームノードの X 方向の移動値を表す 移動X (translate X) には以下のどちらの名前でもアクセスすることができます。
- nurbsSphere1.translateX (長い名前)
- nurbsSphere1.tx (短い名前)
アトリビュートの種類についてはアトリビュートのデータタイプの表を参照してください。
Mayaの内部構造
MAYA において GUI・MEL・Python などを使ってモデリング・アニメーション・シェーディングなどの操作を行なうと以下の操作の全部、または一部が実行されます。
- ノードの作成
- ノードのアトリビュートに値を設定
- ノード同士のアトリビュートを接続
MAYA は、この 3 種のノードとアトリビュートに関する操作だけでモデリング・アニメーション・シェーディングを行なう非常にシンプルなシステムです。
しかし、これだけでは非効率なので、効率良く便利に操作するために GUI のメニューなどや MEL のコマンド・Python関数が作られています。
アトリビュートを扱うための関数
アトリビュートをあつかうための関数には以下のようなものがあります。
- maya.cmds.getAttr(ノード名.アトリビュート名)
- アトリビュートの値を得ます。
詳しい解説は「アトリビュートの値の取得」を参照してください。
- maya.cmds.setAttr(ノード名.アトリビュート名, アトリビュートの値)
- アトリビュートの設定します。
詳しい解説は「アトリビュートの値の設定」を参照してください。
- maya.cmds.listAttr(ノード名)
- ノードに存在するアトリビュート名をリスト表示します。
- maya.cmds.connectAttr(ノード名1.アトリビュート名1, ノード名2.アトリビュート名2)
- アトリビュートの接続をします。
ノード 1 のアトリビュート 1 をノード 2 のアトリビュート 2 に接続します。
- maya.cmds.disconnectAttr(ノード名1.アトリビュート名1, ノード名2.アトリビュート名2)
- アトリビュートの接続を切り離します。
ノード 2 のアトリビュート 2 に接続されているノード 1 のアトリビュート 1 を切り離します。
- maya.cmds.aliasAttr(アトリビュート別名 ノード名.アトリビュート名)
- アトリビュートに別名をつけます。
別名をつけても元の名前もそのまま使えます。
また、別名はひとつしか付けられないので、
すでに別名が付けられているアトリビュート名に新しく別名を付けると古い別名は無くなります。
- maya.cmds.aliasAttr(ノード名.アトリビュート別名, remove=True)
- アトリビュートの別名を取り消します。
または、以下のように元のアトリビュート名でも取り消すことができます。
aliasAttr(ノード名.アトリビュート名, remove=True)
- maya.cmds.addAttr(ノード名, longName=長いアトリビュート名, shortName=短いアトリビュート名, dt=データ型, at=アトリビュート型, min=最小値, max=最大値)
- ダイナミックアトリビュートを追加します。
ノードにダイナミックアトリビュートを追加したい時に使用します。
このコマンドを使用する場合は、最低限「長いアトリビュート名」か「短いアトリビュート名」が必要です。
「データ型」「アトリビュート型」についてはアトリビュートのデータタイプの表を参照してください。
- maya.cmds.deleteAttr(ノード名.アトリビュート名)
- ダイナミックアトリビュートを削除します。
元からあるアトリビュート、例えば NURBS の球を作成した時に作られるトランスフォームノードの translateX(移動X) などは削除できません。
以下の例では getAttr() 関数によってアトリビュートの値を得て、変数に代入する方法を解説します。
- ノード名 nurbsSphere1 の移動X をあらわすアトリビュート translateX (省略した名前は tx)を、変数に代入したい時は以下のように実行します。
tx = maya.cmds.getAttr('nurbsSphere1.tx');
- ある string (文字列)の変数に名前が代入されているノードのアトリビュートを、他の変数に代入する時は以下のように実行します。
変数名 = maya.cmds.getAttr(変数名 + '.アトリビュート名')
これらは場合によって使い分けます。
以下のコマンドはノード名 nurbsSphere1 のアトリビュート translateY (tx) の値を、変数 ty に代入するものです。
name = 'nurbsSphere1';
ty = maya.cmds.getAtrr(name + '.ty')
- sphere() 関数などで作られたノードの名前を変数に代入し、
そのノードのアトリビュートを得たい場合は以下のように実行します。
sname = maya.cmds.sphere()
tz = maya.cmds.getAttr(sname[0] + '.tz')
この場合、
tz = maya.cmds.getAttr(sname[0].tz)
ではエラーになることに注意してください。
Tips
あるノードの複数のアトリビュートの値を得たい場合には、以下のように最初にノードを選択しておくと、ノード名を省略することができます。
maya.cmds.select('nurbsSphere1')
maya.cmds.getAttr('.tx')
maya.cmds.getAttr('.ty')
maya.cmds.getAttr('.tz')
以下の例では setAttr() 関数によってアトリビュートの値を設定する方法を解説します。
- ノード名 nurbsSphere1 のアトリビュート translateX (省略した名前は tx)に値(2.5)を設定したい場合は以下のように実行します。
maya.cmds.setAttr('nurbsSphere1.tx', 2.5)
- ある文字列の変数に名前が代入されているノードのアトリビュートに値を設定する場合は以下のように実行します。
name = 'nurbsSphere1'
maya.cmds.setAttr((name + '.tx'), 2.5)
- sphere() 関数などで作られたノードの名前を変数に代入し、
そのノードのアトリビュートに値を設定したい場合は以下のように実行します。
sname = maya.cmds.sphere()
maya.cmds.setAttr((sname[0] + '.ty'), 2.5)
この場合、
maya.cmds.setAttr(sname[0].ty, 2.5)
ではエラーになることに注意してください。
Tips
あるノードの複数のアトリビュートに値を設定したい場合には、以下のように最初にノードを選択しておくと、ノード名を省略することができます。
maya.cmds.select('nurbsSphere1')
maya.cmds.setAttr('.tx', 2.5)
maya.cmds.setAttr('.ty', 3.0)
maya.cmds.setAttr('.tz', 5.2)
アトリビュートの例
アトリビュートに値を設定する方法によって、球体を螺旋上に並べる Python スクリプトを作ってみましょう。
- 以下の MEL スクリプトを Python スクリプトに書き直して、
spiralObjects1.py という名前で保存します。
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;
}
}
- 以下の Python スクリプトを spiralObjects1.py という名前で作ります。
import maya.cmds
def spiralObjects1(rad, num):
r = 0.0
y = 0.0
for i in range(num):
name = maya.cmds.sphere()
maya.cmds.setAttr((name[0] + '.tx'), rad)
maya.cmds.rotate(0, r, 0, ws=True, p=(0, 0, 0))
maya.cmds.setAttr((name[0] + '.ty'), y)
r += 30.0
y += 0.5
- スクリプト エディタ の → によって spiralObjects1.py を読み込んで、テンキーの Enter キーなどで実行します。
- スクリプト エディタ のインプットウインドウに spiralObjects1(5.0, 30) と打ち込んで実行します。
- 半径 5 の螺旋状に球が 30 個並びます。
練習
- 上の spiralObjects1.py を参考にしてプロシージャの引数を一つ増やし
translateY の増減値を引数 iy で変更できる Pythonスクリプトを、
spiralObjects2.py という名前で作ってみましょう。
spiralObjects2(rad, num, iy)
spiralObjects2(5.0, 30, 0.2) の結果
- spiralObjects2.py を参考にして spiralObjects3.py を作り、球体(sphere())の代わりに circle() を使用してチューブになるようにしてみましょう。
spiralObjects3(rad, num, iy)
(ヒント)
最期に maya.cmds.select(all=True) と maya.cmds.loft() を実行します。
spiralObjects3(5.0, 30, 0.4) の結果
(応用)
ヒントでは、実行時に他のオブジェクトが存在しないという前提で、
Python 関数(maya.cmds.select(all=True) と maya.cmds.loft())を実行します。
しかし、spiralObjects3 を実用的なスクリプトにするためには、
実行前にオブジェクトが作られていても、maya.cmds.loft() が正常に実行される必要があります。
そうなるように、スクリプトを改良してみてください。
まとめ
- MAYA ではノードのアトリビュートを設定・コネクトすることによって、モデリング・アニメーション・レンダリングを行います。
- アトリビュートの取得には getAttr() 、設定には setAttr() 関数を使用します。
参考
Prev | Next
Home | Contents
Mail