日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年5月16日土曜日

magコマンド応用編 (3):近づいたら色が変わる

いよいよlinstepを使ってオブジェクト同士が近づいた時だけ色を変えるようなエクスプレッションを作ってみたい。

以前の「magコマンド応用編 (2):近づいたら色が変わる」で、基準となっていた$distの値、最小値1と最大値11を使ってlinstepの値を確認してみた。

{
float $value;
float $result[];

for ($i=1; $i<12;>
{
$result[$i] = `linstep 1 11 $i`;
print ($result[$i]+"\n");
}
}

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1


後は、この値をcolorRが1~0.5へ変化するように対応させてやればよい。


関係を示すと以下のようになる。

$dist $result colorR
1    0.0->  1.0

6    0.5->  0.75

11    1.0->  0.5



linstepの値($result)をcolorRの値に変換するには1から($resultを2で割った値)を引いてやると良い。
これを式にすると以下のようになる。

{
float $value;
float $result[];
float $color[];
for ($i=1; $i<12;>
{
$result[$i] = `linstep 1 11 $i`;
$color[$i] = (1-$result[$i]/2);

print ($color[$i]+"\n");

}
}


計算結果は以下のようなるので間違いないようだ。

1
0.95
0.9
0.85
0.8
0.75
0.7
0.65
0.6
0.55
0.5




今度はこれを応用して以前のスクリプトをlinstepを使った物に変えてみる。

ここまでのテストでは変化する値を作り出すためにfor文を使っていたが、

$distがその役割を果たすので、for文は不要になる。

またエクスプレッションでフレーム毎に計算し、その結果を即座に反映させればいいので、配列を使う必要もなくなる。



//get objects distance.
string $name[] = { "nurbsSphere1","nurbsCone1"};

vector $obj1Vec = `xform -q -t -ws $name[0]`;
vector $obj2Vec = `xform -q -t -ws $name[1]`;

vector $distVec = $obj1Vec - $obj2Vec;
float $dist = `mag $distVec`;

//linstep caliculation
$result=`linstep 1 11 $dist`;

//get color value.
$color = (1-$result/2);
setAttr lambert2.colorR $color;

//show current distance.
print ($dist + "\n");


今度はばっちりだった。
if文を何度も繰り返す必要もなくなり、すっきりとしたエクスプレッションになった。




さてさて、今回はカンマや括弧の入力間違い以外のエラーもほとんどなく、順調だったのでまだ余力が残っている。
この余力を使ってcolorの調整をすることにした、
現在はcolorRのみの値を変化させているため、50%グレイからどちらかというと朱色に変化している。
これを完全な赤に変化させるには、オブジェクトに近づくに従ってG,Bの色をゼロにしてやる必要がある。
先ほどの表に追加すると以下のようになる。


$dist $result colorR colorG,B
1    0.0->  1.0    0.0

6   0.5->   0.75   0.25

11   1.0->  0.5    0.5

これは単純に$resultを半分にしてやればよい。


//get objects distance.
string $name[] = { "nurbsSphere1","nurbsCone1"};

vector $obj1Vec = `xform -q -t -ws $name[0]`;
vector $obj2Vec = `xform -q -t -ws $name[1]`;

vector $distVec = $obj1Vec - $obj2Vec;
float $dist = `mag $distVec`;

//linstep caliculation
$result=`linstep 1 11 $dist`;

//get color value.
$color = (1-$result/2);
$color2 = ($result/2);
setAttr lambert2.colorR $color;
setAttr lambert2.colorG $color2;
setAttr lambert2.colorB $color2;

//show current distance.
print ($dist + "\n");


これで完了。

0 件のコメント:

コメントを投稿