ON-BLOG

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

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

パーティクル続き
次はフィールドの説明。
SIでいうフォースに当たるもの。
種類もだいたい一緒だが、聞きなれないものありますね。
その辺りはまた使うときに、
でコード。

global proc makeField1()
{
	particle -p 0 5 0;
	string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	string $aname[] = `air -pos 3 0 0 -maxDistance 5.0 -dx -1.0 -dy 0.0 -dz 0.0`;
	connectDynamic -fields $aname[0] $pname[0];
}

f:id:tommy_on:20130624001034p:plain
風フィールドですね。
画像で見える通りAirの影響が出てますね。
では説明。

string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;

前と同じですが、今回はXにマイナス方向に放出するようにしている。

string $aname[] = `air -pos 3 0 0 -maxDistance 5.0 -dx -1.0 -dy 0.0 -dz 0.0`;

新しい変数を作り、「air」というフィールド(フォース)をポジション(3 0 0)に配置し、設定を最大距離5.0とし、Xマイナス

方向に風が吹くように設定。

connectDynamic -fields $aname[0] $pname[0];

今回はフィールドとのコネクトなので「-emitters」が「-fields」になっていることに注意が必要。




次はSIでは名前を聞かない「ニュートン」。
なんじゃこれ?となりましたよ。。
まぁとりあえずコード↓

global proc makeField2()
{
	particle -p 5 10 0;
	string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	nurbsPlane;
	scale 0 10 10;
	string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;
	connectDynamic -fields $nname[0] $pname[0];
}

f:id:tommy_on:20130624001215p:plain
ほとんどAirと変わりません。

nurbsPlane;
scale 0 10 10;

ニュートンのターゲット用に作成

string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;

これのオプションはこんな感じですね。
「magnitude」----強さ
「maxDistance」--作用する最大距離
「attenuation」--減衰率
Siではゴールが近い処理なんですかね?



では次にコリジョンの説明。
パーティクルのコリジョンもMELから操作可能との事。
ではコード

global proc makeCollision1()
{
	string $ename[] = `emitter -pos 0.0 5.0 0.0 -type "direction" -dx -1.0 -dy -1.0 -dz 0.0 -spread 0.5 -

rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	
	string $plname[] = `nurbsPlane`;
	scale 0 15 15;
	rotate 0 0 45;
	
	collision -resilience 0.3 -friction 0.1 $plname[0] $pname[0];
	string $gname[] = `gravity`;
	connectDynamic -fields $gname[0] $pname[0];
}

f:id:tommy_on:20130624001603p:plain
衝突判定ですね。
再生するとグリッドに対して衝突判定が入ってますよ。

string $plname[] = `nurbsPlane`;
 scale 0 15 15;
 rotate 0 0 45;

ここでコリジョンオブジェクトを作成。

collision -resilience 0.3 -friction 0.1 $plname[0] $pname[0];

変数$plnameで作成したコリジョンオブジェクトに以下の設定をする。
「-resilience 0.3」弾性0.3なんで、少し弾性(跳ね返り)が弱い値を設定。
「-friction 0.1」摩擦0.3なんで、弱めの摩擦力となります。

string $gname[] = `gravity`;

重力を追加しました。
これでコリジョンの設定OK。
設定した通りの挙動になってますね。

ちなみにこのコマンドで値変えれます。

string $name[] = `ls -sl`;
string $sname[] = `listRelatives $name[0]`;
string  $gname[] = `listConnections($sname[0]+".message")`;
setAttr ($gname[0]+".resilience") 0.8;
setAttr ($gname[0]+".friction") 0.3;

以下なんでか動かない。。。。
また時期見て試してみます。

string $name[] = `ls -sl`;
string $sname[] = `listRelatives $name[0]`;
string  $gname[] = `listConnections($sname[0]+".collisionResilience[0]")`;
disconnectAttr ($gname[0]+".resilience")($sname[0]+".collisionResilience");
disconnectAttr ($gname[0]+".friction")($sname[0]+".collisionFriction");
setAttr ($gname[0]+".resilience") 0.8;
setAttr ($gname[0]+".friction") 0.3;


ほっといて、応用。

global proc makeCollision2(float $Reg, float $Fri)
{
	string $ename[] = `emitter -pos 0.0 5.0 0.0 -type "direction" -dx -1.0 -dy -1.0 -dz 0.0 -spread 0.5 -

rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	
	string $plname[] = `nurbsPlane`;
	scale 0 15 15;
	rotate 0 0 45;
	
	collision -resilience $Reg -friction $Fri $plname[0] $pname[0];
	string $gname[] = `gravity`;
	connectDynamic -fields $gname[0] $pname[0];
}

f:id:tommy_on:20130624001724p:plain
反射する角度を引数で指定してますね。
ただの引数追加なんで、特に内容的に変更はないですね。。

次はこの流れでリジッドボディを進めます。

では…