アトリビュートの取得と設定を行う

MEL スクリプトの場合

MEL スクリプトでは、getAttrsetAttr コマンドを使用してアトリビュート値の取得と設定を行います。

sphere -name "Brawl";
print(getAttr("Brawl.scaleY"));
float $ys = `getAttr Brawl.scaleY`;
setAttr("Brawl.scaleY", $ys * 2);

getParticleAttrsetParticleAttr コマンドを使用して、パーティクルのベクトルまたは浮動小数点配列の要素の取得と設定を行うことができます。

float $Tmp[] = 
 `getParticleAttr -at position FireShape.pt[0]`;
vector $particlePosition = <<$Tmp[0], $Tmp[1], $Tmp[2]>>;
setParticleAttr -at position -vv 0 0 7 FireShape.pt[0];

エクスプレッションの場合

アニメーションのエクスプレッションでは、getAttr と setAttr コマンドは使用できません。エクスプレッションでは、ノード名とアトリビュート名だけが使用できます。

myCone.scaleY = mySphere.scaleX * 2

ノードへのパス

同じシーンにある 2 つのオブジェクトの親オブジェクトが異なる場合、これらのオブジェクトに同じ名前をつけることができます。たとえば、シーンにある 1 つの球の親が GroupA で、もう 1 つの球の親がない場合、2 つとも doughnutHole という名前にすることができます。

このような場合、名前ではどちらのオブジェクトか区別がつかないため、名前だけでオブジェクトを指定することはできません。MEL は次のエラーを出力します。

ERROR: Which one?

どちらのオブジェクトを指定しているかを自動的に判別できない場合、オブジェクトに固有のパスを指定する必要があります。

オブジェクトの検索に必要な階層を列挙したパスを指定することで、必要なオブジェクトを正確に見つけることができます。例:

この例では、hand オブジェクトのフル パスは次の通りです。

|character|shoulder|arm|hand

パイプ記号(|)は、その左側にあるオブジェクトが右側にあるオブジェクトの親であることを表します。

sphere -name doughnutHole;
group -name GroupA;
sphere -p 3 0 0 -name doughnutHole;
setAttr doughnutHole.scaleY 3.3; // ERROR: Which one?
setAttr GroupA|doughnutHole.scaleY 3.3;

親がないオブジェクトを指定するには、オブジェクト名の前にパイプ記号を使用します。

setAttr |doughnutHole.scaleY 0.3;

オブジェクトのフル パス名を指定するには、オブジェクト階層にあるすべての親オブジェクトの名前を入力します。親と親の間は必ずパイプ文字で区切ります。

group -name GroupB GroupA;
setAttr |GroupB|GroupA|doughnutHole.scaleY 1;