アトリビュート

アトリビュートとは

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

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

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

Mayaの内部構造

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

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

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

変数 = オブジェクト.アトリビュート.get()
オブジェクトのアトリビュートの値を取得して変数に代入
ノードオブジェクト nd の移動X をあらわすアトリビュート translateX (省略した名前は tx)を、変数に代入したい時は以下のように実行します。
val = nd.tx.get()

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

オブジェクト.アトリビュート.set()
オブジェクトのアトリビュートに値を設定
ノードオブジェクト nd のアトリビュート translateX (省略した名前は tx)に値(2.5)を設定したい場合は以下のように実行します。
nd.tx.set(2.5)

アトリビュートの例

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

  1. 以下の 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;
    	}
    }
    
  2. 以下の Python スクリプトを spiralObjects1.py という名前で作ります。
    import pymel.core
    
    def spiralObjects1(rad, num):
        r = 0.0
        y = 0.0
        for i in range(num):
            name = pymel.core.sphere()
            name[0].tx.set(rad)
            pymel.core.rotate([0, r, 0], ws=True, p=(0, 0, 0))
            name[0].ty.set(y)
            r += 30.0
            y += 0.5
    
  3. スクリプト エディタ の ファイルスクリプトのロード によって spiralObjects1.py を読み込んで、テンキーの Enter キーなどで実行します。
  4. スクリプト エディタ のインプットウインドウに spiralObjects1(5.0, 30) と打ち込んで実行します。
  5. 半径 5 の螺旋状に球が 30 個並びます。
    [spiralObjects1(5, 30)の実行結果]

スクリプトの解説

import pymel.core
pymel.core モジュールをインポートします。
def spiralObjects1(rad, num):
引数として rad (円の半径の値)と num (球の個数)をとる関数の宣言です。
r = 0.0
球の回転角度を入れておく変数の宣言です。
y = 0.0
球の高さ(translateY)を入れておく変数の宣言です。
for i in range(num):
numfor ループを実行します。
以下は for ループ内の処理の解説です。
name = pymel.core.sphere()
NURBS の球体を作成し、その時作られるノードオブジェクトをリスト name に代入します。
この時、リスト name には以下のように代入されます。
name[0].tx.set(rad)
name[0] (球のトランスフォームノード)のアトリビュート(tx)に値 rad を設定します。 (pymel.core.move([rad, 0, 0]) と結果は同じになります)
pymel.core.rotate([0, r, 0], ws=True, p=(0, 0, 0))
移動された球をワールドスペース内で(0, 0, 0)を中心として Y軸周りに r だけ回転します。
各フラグの意味は以下の通り。
0 r 0
X軸周りに 0 度、Y 軸周りに r 度、Z 軸周りに 0 度回転させます。
ws=True
ワールドスペースで回転させます。
ローカル座標で回転させても意味の無いことに注意してください。
p=(0, 0, 0)
回転の中心を(0, 0, 0)にします。
name[0].ty.set(y)
name[0] (球のトランスフォームノード)のアトリビュート(ty)に y を設定します。
(pymel.core.move([0, y, 0]) と結果は同じになります)
r += 30.0
球の回転角度に30.0を加えます。
y += 0.5
球の translateY の値に0.5を加えます。

アトリビュートを扱うための関数

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

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

練習

まとめ

参考


Prev | Next
Home | Contents
Mail