アトリビュートを切断する
 
 
 

エクスプレッションからアトリビュートを切断すると、エクスプレッションによるアトリビュート値の設定と読み取りは行われなくなります。たとえば、アトリビュートをエクスプレッションによる制御からキーフレームによる制御に切り替える場合に、エクスプレッションとアトリビュートの関連付けを解除します。

次のいずれかの操作を行うと、エクスプレッションとアトリビュートの関連付けが解除されます。

エクスプレッションから切断されたアトリビュートを表示する

エクスプレッションからアトリビュートを切断すると、エクスプレッション エディタでは、そのアトリビュートがそれまで存在していた位置にプレースホルダが表示されます。

シーン内に Ball と Cone という 2 つのオブジェクトがあり、次のエクスプレッションを作成した場合を考えます。

Ball.translateX = Cone.translateX;
Ball.translateY = Cone.translateY;
Ball.translateZ = Cone.translateZ;

シーンから Cone を削除すると、エクスプレッションで Ball の移動(Translate)アトリビュート(移動 X(Translate X)、移動 Y(Translate Y)、移動 Z(Translate Z))を設定するために必要な、Cone の移動アトリビュート(移動 X、移動 Y、移動 Z)は使用できなくなります。

この場合、エクスプレッションを再表示すると、次のような文が表示されます。

Ball.translateX = .I[0];
Ball.translateY = .I[1];
Ball.translateZ = .I[2];

.I[0]、.I[1]、.I[2] という記号は、Cone の移動アトリビュートがエクスプレッションから切断されたことを示します。これらの記号は、エクスプレッション内で以前使用されていたアトリビュートを表すプレースホルダです。

.I は、あるアトリビュートがエクスプレッションへの入力であったことを意味します。エクスプレッションに入力されるアトリビュートの値は、エクスプレッションによって読み取られ、別のアトリビュートまたは変数に代入されます。カッコ内の数値は、エクスプレッション内でそのアトリビュートが読み取られていた順番を表します。

たとえば、エクスプレッションに入力されるアトリビュートのうち、.I[0] は最初に読み取られるアトリビュート、.I[1] は 2 番目に読み取られるアトリビュート、.I[2] は 3 番目に読み取られるアトリビュートを表します。

浮動小数点型または整数型アトリビュートプレースホルダの値は 0 です。パーティクルのシェイプ ノードのベクトル アトリビュートホルダの値は<<0,0,0>>です。この例では、プレースホルダ .I[0]、.I[1]、.I[2] の値は 0 です。エクスプレッションが実行されると、Ball.translateX、Ball.translateY、および Ball.translateZ に値 0 が代入されます。

エクスプレッションから切断したアトリビュートがシーン内にまだ存在している場合、そのアトリビュートの値はエクスプレッションによって最後に設定された値から変化しません。

次のような文を作成したと仮定します。

Ball.translateX = Cone.translateX;
Ball.translateY = Cone.translateY;
Ball.translateZ = Cone.translateZ;

シーンから球を削除すると、Ball.translateX、Ball.translateY、Ball.translateZ の各アトリビュートは存在しなくなります。したがって、このエクスプレッションで Cone の移動 X、移動 Y、移動 Z を Ball の対応する移動アトリビュートに代入することはできません。

この場合、Ball の移動アトリビュートの代わりにプレースホルダが表示されます。エクスプレッションを再表示すると、これらの文は次のように表示されます。

.O[0] = Cone.translateX;
.O[1] = Cone.translateY;
.O[2] = Cone.translateZ;
注:あるエクスプレッションが 1 つのオブジェクトのアトリビュートだけに値を代入している場合は、そのオブジェクトを削除するとエクスプレッションも削除されます。複数のオブジェクトのアトリビュートに値を代入するエクスプレッションは、それらのオブジェクトをすべて削除した場合に、エクスプレッションが削除されます。

上の例のエクスプレッションが削除されないようにするには、削除される球以外のオブジェクトのアトリビュートを設定する文を追加する必要があります。たとえば、次のような文を追加します。

Cone.visibility = 1;

.O[0] という記号は、球の移動アトリビュートがエクスプレッションから切断されたことを表します。.O はアトリビュートがエクスプレッションからの出力であったことを表すプレースホルダです。

エクスプレッションの出力であるアトリビュートには、エクスプレッションによって値が代入されます。カッコ内の数値は、エクスプレッション内でアトリビュートに値が代入されていた順番を表します。

Ball.translateX はエクスプレッションからの 1 番目の出力なので、.O[0] で置き換えられます。Ball.translateY は 2 番目、Ball.translateZ は 3 番目の出力なので、.O[1] と .O[2] で置き換えられます。

エクスプレッションを実行すると、プレースホルダに値が代入されますが、プレースホルダはシーン内のオブジェクトやコンポーネントに影響を与えません。

上の例のエクスプレッションの場合、プレースホルダ.O[0]、.O[1]、.O[2] には Cone.translateX、Cone.translateY、Cone.translateZ の値がそれぞれ代入されますが、これらのプレースホルダによってシーン内のオブジェクトが制御されることはありません。すなわち、このエクスプレッションは何の効果も及ぼしません。

プレースホルダとアトリビュートを関連付ける

エクスプレッションからアトリビュートを切断すると、そのアトリビュートの代わりにプレースホルダがエクスプレッションに表示されます。このプレースホルダは任意のアトリビュートで置き換えることができます。

プレースホルダを置き換える最も直接的な方法は、エクスプレッション内のすべてのプレースホルダを任意のアトリビュート名で上書きすることです。

多くのプレースホルダを含む長いエクスプレッションについては、MEL のconnectAttr コマンドを使用して、エクスプレッション内のすべてのプレースホルダを新しいアトリビュート名で一度に置き換えることができます。 ウィンドウ > 一般エディタ > コネクション エディタ(Window > General Editors > Connection Editor)を使用することもできます。

例 1

HorseController というエクスプレッションの中に、次の文があると仮定します。

WhiteHorse.translateX = Car.translateX;
BlackHorse.translateX = Car.translateX;
BrownHorse.translateX = Car.translateX;

Car を削除してエクスプレッションをリロードすると、これらの文は次のように表示されます。

WhiteHorse.translateX = .I[0];
BlackHorse.translateX = .I[0];
BrownHorse.translateX = .I[0];

.I[0] は、以前の Car.translateX アトリビュートを表すプレースホルダです。このプレースホルダを別のアトリビュートで置き換えることにより、WhiteHorse、BlackHorse、BrownHorse の移動 X(Translate X)アトリビュートにそのアトリビュートの値を代入することができます。

たとえば、これらの移動 X(Translate X)アトリビュートを Cow というオブジェクトの移動 X アトリビュートを使用して制御する場合は、次の MEL コマンドをコマンド ラインに入力します。

connectAttr Cow.tx HorseController.input[0]

このコマンドを実行すると、アトリビュート Cow.tx がエクスプレッションの input[0] に関連付けられます。エクスプレッションの名前は HorseController です。エクスプレッション内で、input[0] は .I[0] と略記されます。ハイパーグラフ(Hypergraph)グラフ > 入力と出力コネクション(Graph > Input and Output Connections)を選択すると、input[0] に関連するアトリビュートのロングネームを確認することができます。

エクスプレッションをリロードすると、新しく関連付けられたアトリビュートが表示されます。

WhiteHorse.translateX = Cow.translateX;
BlackHorse.translateX = Cow.translateX;
BrownHorse.translateX = Cow.translateX;

例 2

connectAttr コマンドを使用して、エクスプレッションの出力を再指定することもできます。HorseController というエクスプレッションの中に、次の文があると仮定します。

WhiteHorse.translateX = Car.translateX;
BlackHorse.translateX = Car.translateX;
BrownHorse.translateX = Car.translateX;

BrownHorse オブジェクトを削除してエクスプレッションをリロードすると、文は次のように表示されます。

WhiteHorse.translateX = Car.translateX;
BlackHorse.translateX = Car.translateX;
.O[2] = Car.translateX;

.O[2] は、以前の BrownHorse.translateX アトリビュートを表すプレースホルダです。BrownHorse.translateX はエクスプレッションからの 3 番目の出力であったので、そのプレースホルダは .O[2] という名前になります (エクスプレッションからの 1 番目と 2 番目の出力は .O[0] と .O[1] です)。このプレースホルダを別のオブジェクトアトリビュートで置き換えることにより、3 番目の文に示すように、Car.translateX の値を一緒に制御することができます。

たとえば、RedHorse.translateX という新しいオブジェクトのアトリビュートを Car.translateX の値によって制御する場合は、コマンド ラインに次の MEL コマンドを入力します。

connectAttr HorseController.output[2] RedHorse.tx

このコマンドは、HorseController エクスプレッションの output[2] を RedHorse.tx アトリビュートに関連付けます。エクスプレッションでは、output[2] が .O[2] と略記されます。

エクスプレッションをリロードすると、新しく関連付けられたアトリビュートが表示されます。

WhiteHorse.translateX = Cow.translateX;
BlackHorse.translateX = Cow.translateX;
RedHorse.translateX = Cow.translateX;