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]; }
風フィールドですね。
画像で見える通り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]; }
ほとんど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]; }
衝突判定ですね。
再生するとグリッドに対して衝突判定が入ってますよ。
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]; }
反射する角度を引数で指定してますね。
ただの引数追加なんで、特に内容的に変更はないですね。。
次はこの流れでリジッドボディを進めます。
では…