ON-BLOG

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

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

では次コンストレイン。
リジッドボディ側のコンストですね。

global proc makeFuriko1()
{
	int $i;
	string $sname[];
	
	string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
	for($i = 0 ; $i < 3 ; $i++)
		{
		$sname = `sphere`;
		float $x = 2.03 * $i;
		move $x 0 0;
		if($i == 0)
			{
			move 0 5 0 ($sname[0] + ".rotatePivot");
			rotate 0 0 -80;
			}
		rigidBody -active -mass 0.5 -bounciness 1.0;
		constrain -hinge -p $x 5 0;
		connectDynamic -f $gname[0] $sname[0];
		}
}

f:id:tommy_on:20130625231518p:plain
では説明.

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

重力作成。

float $x = 2.03 * $i; move $x 0 0;

各振り子の玉の移動値の計算。2.03と0.3入れてるのは重なると破綻するから、ギリギリの値を代入
少しだけ離れるようにすると、振り子っぽくなる。

if($i == 0)「move 0 5 0 ($sname[0] + ".rotatePivot");rotate 0 0 -80;

一個の動き設定。センターの移動。回転値を入れて、振り子っぽくなるようにセンターを移動。

rigidBody -active -mass 0.5 -bounciness 1.0;

リジッドボディの設定。$sname[0]を質量0.5 弾性を1.0にしてリジッドボディをオンに。

constrain -hinge -p $x 5 0;

$sname[0]にヒンジコンストレインを実行位置は指定に移動。($x 5.0 0.0)

connectDynamic -f $gname[0] $sname[0];

重力を設定。

う~んあんまりわからんですね。
なんで、訳してみました。
①空変数宣言
②$gnameに重力を格納
③空変数にスフィア格納
④txに2.03*$iをかける※この値が跳ね返ったあとの移動値になる。
⑤その値を使ってXに移動※同様
⑥一個目の時の処理
 センター軸をYに5.0移動
 -80Z軸に回転
⑦snameにリジッドボディを質量0.5 弾性1.0に設定
⑧ヒンジコンストレインを作り、XとYに移動する。
⑨フォースの適用。

もっと簡単にすると、重力作って、スフィアを2.03*i分横にずらして数分作成。
一番始めのやつだけ、センターを移動して、球を上部で移動させる。
あとはヒンジコンストレインを球の上5の位置に配置してダイナミクスを適用させて終わり。

こんな感じ。まぁ一度実行すれば意味がよくわかるかと。。

次コンストレインの応用
チェーンを繋ぐってやつです。
リジットボディではよくありますよね。

global proc makeChain1()
{
	int $i;
	string $tname[];
	string $ptname;
	string $gname[] = `gravity`;
	for($i = 1 ; $i < 10 ; $i++)
		{
		$tname = `torus -hr 0.2`;
		scale 2 3 2;
		rotate 0 ($i % 2 * 90) 90;
		move ($i * 4) 0 0;
		if($i == 1)
			{
			constrain -nail -p 0 5 0 $tname[0];
			}
		else
			{
			constrain -pin $ptname $tname[0];
			}
		connectDynamic -f $gname[0] $tname[0];
		$ptname = $tname[0];
		}
}

f:id:tommy_on:20130625231531p:plain
少し数学的な箇所が見えますね。
では説明を。

$tname = `torus -hr 0.2`;
  • hrフラグはトーラスの輪の長さ(円柱部分)になる。

トーラスはポリゴンとナーブスで生成に違いがある。
共に全体の半径4 中輪の半径が2のトーラスを作成すると仮定。
ナーブスは

torus -r 4 -hr 0.5」= 「torus -r 4 ( 4 * 0.5)

ポリゴンは

polyTorus -r 4 -sr 2

となる。

rotate 0 ($i % 2 * 90) 90;

Y回転値だけ、トーラスを1つ飛ばしに90度回す感じになってる。
なぜなら、式が余りを求めている為、i=1なら「(余り1 * 90)=(90)」となり、
ならi=2「(余り0 * 90)=(0)」となる為。

move ($i * 4) 0 0;

横に移動。

if($i == 1){constrain -nail -p 0 5 0 $tname[0];}

1つめ時のみ実行。コンストレインの「ネイル」で(0 5 0)に作成

else{constrain -pin $ptname $tname[0];}

2つ目以降はコンストレイン「Pin」を実行し
今作られたトーラス($tname)と一個前のトーラス($ptname)で
それぞれ実行。これでリジッドボディになる。

connectDynamic -f $gname[0] $tname[0];

フォースの適用。

$ptname = $tname[0];

トーラスを今作られたやつと一個前に作られたやつを振り分けるため
「$ptname」に一個前のデータとして格納


とまぁこれ、スクリプトでやらなくても感が強いんですが。。
にしてもこれをコードでこんなに短くできるのは、
MELの強みでしょうね。。


では…