XSIユーザーから観たMELスクリプトについて 其の十二
では次エクスプレッション。
MAYAのエクスプレッションは素晴らしい!
と幾度も聞いた事があります。
ではそんなエクスプレッションを見ていきます。
今回はコーンをSinで遊んだものですね。
下記の事例はよく使うので、覚える必要がありますね。
makeExpression(10,2) global proc makeExpression(int $num ,int $axis) { int $i; for( $i = 0 ; $i < $num ; $i++ ) { string $name[] = `cone`; move ( $i * 2 ) 0 0; float $val = $i * 0.3; if($axis == 1) { expression -object $name[0] -string (" sx = 3 * sin( time + "+ $val +");"); } else if($axis == 2) { expression -object $name[0] -string (" sy = 3 * sin( time + "+ $val +");"); } else if($axis == 3) { expression -object $name[0] -string (" sz = 3 * sin( time + "+ $val +");"); } } }
コーンがスケールYで揺らいでます。
説明すると、
float $val = $i * 0.3;
でスケールにランダム値を入れてます。奇数であればなんでもOK
expression -object $name[0] -string (" sy = 3 * sin( time + "+ $val +");");
中身ですね。
普通ならSinの中身「sin( time + $val )」と書きたい所ですが、
$Valはエクスプレッションから参照できないからみたいです。
分解すると
"sy = 3 * sin( time + "+ 」「$Val」「+");");
順番があるみたいで、まずは「$Val」がまず「$i * 0.3」の結果(文字列)として値で代入されます。
その後全て結合され、エクスプッションとなります。なんで、「i」が2「time」が10Fの場合だとすると
「 (" sy = 3 * sin( 10 + (2 * 0.3) );");」==【 sy = 3 * sin( 10.6 )】となりますね。
一番大事なのは、エクスプレッションが変数をそのまま扱えないという事。
ここさえ気をつければ大きな弊害はないかと思います。
で、SI版。
微妙に挙動が違いますが。。。
Make(10,3) function Make(num,axis) { for( var i = 1 ; i < num+1 ; i++ ) { var Cone = CreatePrim("Cone", "MeshSurface", null, null); SetValue(Cone+".cone.height", 2, null); Translate(Cone, 0, i * 2 , 0); var Val = i * 0.4; Logmessage(Val); if(axis == 1) { SetExpr(Cone+".kine.local.sclx", "sin( Fc * " + Val + ")"); } else if(axis == 2) { SetExpr(Cone+".kine.local.scly", "sin( Fc * " + Val + ")"); } else if(axis == 3) { SetExpr(Cone+".kine.local.sclz", "sin( Fc * " + Val + ")"); } } }
はい。
そんなに変わりませんね。
やはりエクスプレッション内での変数の扱い型だけは
MAYAは気をつけないといけませんね。。
一回わって次回岩作ります。
では…