ON-BLOG

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

XSIユーザーから観たMELスクリプトについて 其の一七

ではでは続いてリジッドボディ
これもMELから操作が簡単にできます。
コード

global proc makeRigid1()
{
	string $sname[] = `sphere`;
	string $pname[] = `nurbsPlane`;
	scale 10 30 20;
	rotate 0 0 115;
	move -r 3 -8 0;
	
	string $rname = `rigidBody -active -initialVelocity 10.0 0.0 0.0 -bounciness 0.5 -staticFriction 0.4 $sname[0]`;
	rigidBody -passive $pname[0];
	string $gname[] = `gravity -pos 0 0 0`;
	connectDynamic -fields $gname[0] $rname;
}

f:id:tommy_on:20130624003136p:plain
前回のコリジョンと似てますねw
では説明。

コリジョンと同じで、ターゲットが必要ですね。

string $rname = `rigidBody -active -initialVelocity 10.0 0.0 0.0 -bounciness 0.5 -staticFriction 0.4 $sname[0]`;

ここでアクテイブ側の設定を行なっています。
「-active」アクティブ宣言
「initialVelocity」初期スピードです。X方向に10飛ぶように設定
「-bounciness 0.5」弾性値が平均値になってますね。値が小さければ弾性が弱くなります。※跳ねなくなります。
「-staticFriction 0.4」摩擦力です。数値が大きくなれば摩擦は強くなります。

rigidBody -passive $pname[0];

パッシブ側の設定です。

string $gname[] = `gravity -pos 0 0 0`;

フィールド(フォース)を設定。
ボールをプロットする方法は
Edit→Keys→bake Simulationで可能。

一応下記にコードありますが、なんか動きません。
なんででしょうか?

string $sname[] = `sphere`;
string $rname[] = `rigidBody -active $sname[0]`;
string $gname[] = `gravity`;
connectDynamic -fields $gname[0] $rname;
bakeResults -simulation true -t "1:30" -sampleBy 1 -disableImplicitControl true -preserveOutsideKeys true -shape true $sname[0];


でこれの応用編。
作られるプリミティブのタイプの変更と弾性、摩擦の引数化

global proc makeRigid2(string $type , float $Bou , float $Static)
{
	string $sname[] = `eval $type`;
	string $pname[] = `nurbsPlane`;
	scale 10 30 20;
	rotate 0 0 115;
	move -r 3 -8 0;
	
	string $rname = `rigidBody -active -initialVelocity 10.0 0.0 0.0 -bounciness $Bou -staticFriction $Static $sname[0]`;
	rigidBody -passive $pname[0];
	string $gname[] = `gravity -pos 0 0 0`;
	connectDynamic -fields $gname[0] $rname;
}

f:id:tommy_on:20130624003252p:plain
円錐になってますね。

ここで注目したいのが、引数で文字列を渡し、それをプリミティブで作成してるんですが、
そのまま引数を書くとエラーになります。なので以前使用した文字列をコードして返す「eval」
を使用します。
前に`eval書いてスペース $type`と書くことでコードとして評価されます。

とこんな感じで書きました。
この手のスクリプトはMAYA優秀ですね。
ほんと色々できそうです。



では…