クロスシュミレーション MEL スクリプト

MEL スクリプトの例

ジョイントを使用したクロスシュミレーションの手順を、 MEL スクリプトで自動化してみましょう。

  1. 以下の MEL スクリプトを clothJoint1.mel という名前で作ります。
    global proc clothJoint1()
    {
    	int $i;
    
    	string $jname1 = `joint -p 0.0 8.0 0 `;
    	joint -p 1.0 3.0 0 ;
    	joint -p 1.0 -3.0 0 ;
    	string $jname2 = `joint -p -0.0 -8.0 0`;
    
    	string $pname[] = `nurbsPlane`;
    	scale -r 20 20 10;
    	setAttr ($pname[1] + ".patchesU") 20;
    	setAttr ($pname[1] + ".patchesV") 30;
    
    	select $jname1;
    	select -add $jname2;
    	string $iname[] = `ikHandle -sol ikSplineSolver`;
    
    	string $cpname[] = `soft -c -g 0.5 $iname[2]`;
    
    	string $tname[] = `turbulence -m 50 $cpname[0]`;
    	connectDynamic -f $tname[0] $cpname[0];
    
    	string $psname[] = `listRelatives $cpname[0]`;
    	addAttr -longName goalWeight0PP -dt doubleArray $psname[0];
    	addAttr -longName goalWeight0PP0 -dt doubleArray $psname[0];
    	float $val = 1.0;
    	int $count = `getAttr ($psname[0] + ".count")`;
    	for($i = 0; $i < $count; $i++)
    	{
    		particle -e -or $i -at goalWeight0PP -fv $val $psname[0];
    		$val /= 2.0;
    		if($val < 0.1)
    		{
    			$val = 0.1;
    		}
    	}
    	skinCluster -weight 0.1 $pname[0] $jname1;
    	soft -g 1.0 $pname[0];
    }
    
  2. Script EditorFile → Source Script によって clothJoint1.mel を読み込みます。
  3. Script Editor のインプットウインドウで、clothJoint1() を実行します。
    (clothJoint1() 実行後の図)
    [clothJoint1() 実行後の図]
  4. アニメーションを実行します。
    [アニメーション実行後の図]

スクリプトの解説

global proc clothJoint1()
clothJoint1 という名前のプロシージャを宣言します。
int $i;
for 文で使用するカウンター用変数 $i を宣言します。
string $jname1 = `joint -p 0.0 8.0 0 `;
1 番目のジョイントを作成し、その名前を変数 $jname1 に代入します。
ここで作成するジョイントは、サンプル用です。
joint -p 1.0 3.0 0 ;
2 番目のジョイントを作成します。
joint -p 1.0 -3.0 0 ;
3 番目のジョイントを作成します。
string $jname2 = `joint -p -0.0 -8.0 0`;
最後のジョイントを作成し、その名前を変数 $jname2 に代入します。
string $pname[] = `nurbsPlane`;
NURBS の平面を作成します。
scale -r 20 20 10;
NURBS の平面に適当にスケールをかけます。
setAttr ($pname[1] + ".patchesU") 20;
NURBS の平面の U 方向の分割数を 20 にします。
setAttr ($pname[1] + ".patchesV") 30;
NURBS の平面の V 方向の分割数を 30 にします。
select $jname1;
1 番目のジョイントを選択します。
select -add $jname2;
最後のジョイントを選択します。
string $iname[] = `ikHandle -sol ikSplineSolver`;
選択されている 1 番目のジョイントと最後のジョイントに IK スプラインハンドルを設定します。
変数 $iname には作成されたオブジェクト名が以下のように代入されます。
$iname[0]
IK ハンドルの名前 (ikHandle1 など)
$iname[1]
エフェクターの名前 (effector1 など)
$iname[2]
NURBS カーブの名前 (curve1 など)
string $cpname[] = `soft -c -g 0.5 $iname[2]`;
IK スプラインハンドルの NURBS カーブを複製し、 オリジナルの NURBS カーブをソフトボディに変換します。
変数 $cpname には作成されたパーティクルの名前が代入されます。
string $tname[] = `turbulence -m 50 $cpname[0]`;
Turbulence フィールドを作成します。
-m フラグによって、Turbulence フィールドの強さ(magnitude)は 50 に設定されます。
作成された Turbulence フィールドの名前が変数 $tname に代入されます。
connectDynamic -f $tname[0] $cpname[0];
Turbulence フィールドとソフトボディのパーティクルをコネクトします。
string $psname[] = `listRelatives $cpname[0]`;
パーティクルの名前からパーティクルシェイプの名前(curve1ParticleShape など)を求めます。
addAttr -longName goalWeight0PP -dt doubleArray $psname[0];
パーティクルシェイプに goalWeight0PP という名前のアトリビュートを追加します。
このアトリビュートによって、オリジナルの NURBS カーブが複製された NURBS カーブに、 どの程度追従するかが決まります。
addAttr -longName goalWeight0PP0 -dt doubleArray $psname[0];
パーティクルシェイプに goalWeight0PP0 という名前のアトリビュートを追加します。
このアトリビュートを追加しないと、 アニメーションをプレイバックした後に goalWeight0PP の値が失われます。
float $val = 1.0;
変数 $val の値を 1.0 に初期化して宣言しています。
この変数は goalWeight0PP の値を設定するために使用します。
int $count = `getAttr ($psname[0] + ".count")`;
パーティクルオブジェクトに含まれるパーティクルの個数を調べて、 変数 $count に代入します。
for($i = 0; $i < $count; $i++)
パーティクルの個数分だけ for 文を繰り返します。
particle -e -or $i -at goalWeight0PP -fv $val $psname[0];
パーティクルオブジェクトの $i 番目のパーティクルに $val の値を設定します。
$val /= 2.0;
次の goalWeight0PP の値を計算しています。
$val の値は小さくしてゆく必要があるので、 2.0 で除算しています。 2.0 は他の値でもかまいません。
if($val < 0.1)
{
  $val = 0.1;
}
goalWeight0PP の値が 0.1 以下にはならないように、 $val の値が 0.1 以下ならば、0.1 に戻しています。
0.1 以下の値だと動きが大きくなりすぎる恐れがあります。 動きをもっと小さくしたい場合は、0.1 より大きな値にする必要があります。
goalWeight0PP の計算が終わった後の値は以下のようになります。
[コンポーネントエディタ]
skinCluster -weight 0.1 $pname[0] $jname1;
ジョイントを NURBS 平面にスムースバインドします。
-weight フラグによって、weight 値は 0.1 に設定されます。
soft -g 1.0 $pname[0];
NURBS 平面を複製し、複製された NURBS 平面をソフトボディに変換します。
複製された NURBS 平面が、オリジナルの NURBS 平面に追従する程度が 1.0 に設定されているので、 2 つの平面は正確に同じ動きをします。

練習

練習課題

参考


Prev
Home | Contents
Mail