リグ作成

リグ作成

リグをMELで自動的に作成するプログラムを作成してみます。

リグを作るプログラム

足の部分を作るMELスクリプトです。

  1. 以下のプロシージャを makeRig1.mel と言う名前でファイルに書き込みます。
    global proc string makeCube(float $sx, float $sy, float $sz, float $tx, float $ty, float $tz)
    {
    	string $name = `curve -d 1 -p -1 0 -1 -p 1 0 -1 -p 1 0 1 -p -1 0 1 -p -1 0 -1 -p -1 2 -1 -p 1 2 -1 -p 1 0 -1 -p 1 0 1 -p 1 2 1 -p 1 2 -1 -p -1 2 -1 -p -1 2 1 -p 1 2 1 -p 1 0 1 -p -1 0 1 -p -1 2 1 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16`;
    	scale $sx $sy $sz;
    	move $tx $ty $tz;
    	return $name;
    }
    
    global proc makeLeg(int $flag, string $wast)
    {
    	float $tx;      // 各部品の位置X座標
    	string $leg;    // 足根元
    	string $knee;   // ひざ
    	string $heel;   // かかと
    	string $foot;   // 足
    	string $toe;    // つま先
    	string $ik;     // 足全体のIKHandle
    	string $ikfoot; // 足のIKHandle
    	string $iktoe;  // つま先のIKHandle
    	string $loc;    // ひざロケータ
    
    	if($flag == 0)
    	{
    		// 右足の各部品名
    		$tx = -2.0;
    		$leg = $wast + "rightLeg";
    		$knee = $wast + "rightKnee";
    		$heel = $wast + "rightHeel";
    		$foot = $wast + "rightFoot";
    		$toe = $wast + "rightToe";
    		$ik = $wast + "rightIkHandle";
    		$ikfoot = $wast + "rightFootIk";
    		$iktoe = $wast + "rightToeIk";
    		$loc = $wast + "rightLocator";
    	}
    	else
    	{
    		// 左足の各部品名
    		$tx = 2.0;
    		$leg = $wast + "leftLeg";
    		$knee = $wast + "leftKnee";
    		$heel = $wast + "leftHeel";
    		$foot = $wast + "leftFoot";
    		$toe = $wast + "leftToe";
    		$ik = $wast + "leftIkHandle";
    		$ikfoot = $wast + "leftFootIk";
    		$iktoe = $wast + "leftToeIk";
    		$loc = $wast + "leftLocator";
    	}
    	// ジョイント作成
    	joint -p $tx 10 0 -n $leg $wast;
    	joint -p $tx 5 0 -n $knee $leg;
    	joint -p $tx 0 0 -n $heel;
    	joint -p $tx -1 2 -n $foot;
    	joint -p $tx -1 3 -n $toe;
    
    	// 優先角設定
    	rotate -r 10 0 0 $knee;
    	joint -e -spa -ch $knee;
    	rotate -r -10 0 0 $knee;
    
    	// ikハンドル作成
    	ikHandle -sol ikRPsolver -sj $leg -ee $heel -n $ik;
    	ikHandle -sol ikSCsolver -sj $heel -ee $foot -n $ikfoot;
    	ikHandle -sol ikSCsolver -sj $foot -ee $toe -n $iktoe;
    
    	// 足コントローラ用カーブ作成
    	string $footct = makeCube(0.533, 0.846, 1.102, $tx, -1.2, 0.9);
    	string $heelct = makeCube(0.291, 0.448, 0.717, $tx, -1.172, -0.408);
    	string $toect = makeCube(0.328, 0.297, 0.523, $tx, -1.189, 2.528);
    
    	// 足コントローラ作成
    	parent $ik $footct;
    	parent $heelct $footct;
    	parent $toect $heelct;
    
    	setAttr ($toect+".rotatePivotZ") -0.72;
    	select -r $toect;
    	select -add $iktoe;
    	parentConstraint -mo -weight 1;
    
    	setAttr ($heelct+".rotatePivotZ") 0.42;
    	select -r $heelct;
    	select -add $ik;
    	parentConstraint -mo -weight 1;
    	select -r $heelct;
    	select -add $ikfoot;
    	parentConstraint -mo -weight 1;
    	   
    	// ひざコントローラ
    	spaceLocator -n $loc;
    	move $tx 5 5;
    	makeIdentity -apply true -t 1 -r 1 -s 1 -n 0;
    	poleVectorConstraint -weight 1 $loc $ik;
    }
    
  2. ファイル → スクリプト エディタ で makeRig1.mel を読み込みます。
  3. スクリプト エディタ で以下のコマンドを実行してみます。
    string $myWast = "myWast1";
    joint -p 0 12 0 -n $myWast;
    // 左足作成
    makeLeg(1, $myWast);
    // 右足作成
    makeLeg(0, $myWast);
    

    [makeRig1() の実行例]

参考


Prev
Home | Contents
Mail