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]; } }
では説明.
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]; } }
少し数学的な箇所が見えますね。
では説明を。
$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の強みでしょうね。。
では…