ON-BLOG

CGのこと、あれこれ書いてます。

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で揺らいでます。
f:id:tommy_on:20130619014430p:plain
説明すると、

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 + ")");
				}
		}
}

はい。
そんなに変わりませんね。
f:id:tommy_on:20130619020233j:plain
やはりエクスプレッション内での変数の扱い型だけは
MAYAは気をつけないといけませんね。。

一回わって次回岩作ります。

では…