ON-BLOG

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

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

続いてはパーティクル。
Melでパーティクルを制御するんですね。
あ、SI版は無しで。やりかた全くわかんないんです。
また探ってみます。
ではコード

global proc makeParticle3(int $num, float $XR , float $YR , float $ZR ,int $type)
{
	int $i;
	float $x , $y , $z;
	string $points = "";
	
	for($i = 0 ; $i < $num ; $i++)
		{
		$x = rand(-($XR),$XR);
		$y = rand(-($YR),$YR);
		$z = rand(-($ZR),$ZR);
		$points = $points + "-p " + $x + " " + $y + " " + $z + " ";
		}
	eval("particle " + $points);
	string $sel[] = `ls -sl`;
	setAttr ($sel[0] + ".particleRenderType") $type;
}

f:id:tommy_on:20130623222806p:plain
パーティクルをランダムで配置するスクリプトです。
単純に配置してるだけです。。。。。。

あ、ここ注意↓

$points = $points + "-p " + $x + " " + $y + " " + $z + " ";

ここスペースがある事に注意が必要。
あと表示タイプは任意で決めてれます。
次はエミッターを使ったパーティクル処理。

particle -p 1 0 0  -p 0 1 0 -p 0 0 1;
string $name[] = `emitter -rate 10 -minDistance 1.5 -maxDistance 2.5;
particle;
connectDynamic -emitters $name[0];
particle -p 1 0 0  -p 0 1 0 -p 0 0 1;

この位置からパーティクルを発生位置を決定 = (①X1 Y0 Z0②X0 Y1 Z0③X0 Y0 Z1)

string $name[] = `emitter -rate 10 -minDistance 1.5 -maxDistance 2.5;

エミッターの設定 レート10 1.5から発生して2.5で終了する設定を変数に格納

particle;

空のパーティクルを作成

connectDynamic -emitters $name[0];

エミッターとリンクして、発生させる。



次、選択物をエミッターにする方法。
「選択から発生」と同じですね。

global proc makeEmitter1()
{
	string $name[] = `sphere`;
	scale 5 5 5;
	expression -object $name[0] -string "ry = 30 * time";
	string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`;
	string $pname[] = `particle`;
	expression -object $pname[0] -string "ry = 30 * time";
	connectDynamic -emitters $ename $pname[0];
}

f:id:tommy_on:20130623222947p:plain
いっぱい出てますねw
中心には球体があります。
これから発生してるんです。
では下記に説明。

expression -object $name[0] -string "ry = 30 * time";

スフィア回してます。

■「string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`;

エミッターの設定 法線スピードを1.0 接線スピード0レートを1

string $pname[] = `particle`;

空のパーティクル作成

expression -object $pname[0] -string "ry = 30 * time";

パーティクル自体を回す。

connectDynamic -emitters $ename $pname[0];

リンク付け。

エミッターに関する記載が増えたぐらいで、
大きくは変わらないです。



エミッター部分でもう一個応用。

global proc makeEmitter1()
{
	string $name[] = `ls -sl`;
	expression -object $name[0] -string "ry = 30 * time";
	expression -object $name[1] -string "ry = 30 * time";
	string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`;
	string $ename2[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[1]`;
	string $pname[] = `particle`;
	string $pname2[] = `particle`;
	expression -object $pname[0] -string "ry = 30 * time";
	expression -object $pname2[0] -string "ry = 30 * time";
	connectDynamic -emitters $ename $pname[0];
	connectDynamic -emitters $ename2 $pname2[0];
}

f:id:tommy_on:20130623223900p:plain
選択したオブジェクトから発生させるってやつ。
単純に2個増やしただけやけど大丈夫なのか?
まぁコード的にもそんな変わらないんでこのまま行きます。





と言いましたが、一旦ここで閉じます。


では…