キーフレームアニメーション

キーフレームアニメーションの手順

MEL によってキーフレームアニメーションを実行する場合は、以下の手順で作ってゆきます。

  1. currentTime で現在の時間を設定します。
  2. ノードのアトリビュートを変更します。
  3. setKeyframe でキーフレームを設定します。
  4. 上の1から3を必要なフレーム数だけ繰り返します。

キーフレームアニメーションはキーを設定可能なアトリビュートにのみ有効です。
例えば、トランスフォームノードではデフォールトで translateX, translateY, translateZ, rotateX, rotateY, rotateZ, scaleX, scaleY, scaleZ, visibility などがキーを設定可能になっています。
もし、デフォールトでキーを設定できないアトリビュートにキーフレームアニメーションをつけるときは、以下のコマンドによってキーを設定可能にします。
setAttr -k on ノード名.アトリビュート名

GUIでは Window → General Editors → Channel Control によって行ないます。

Tips

キーを設定可能なアトリビュートのリストを調べるためには、以下のコマンドを使用します。

listAttr -k ノード名

アニメーションの例

キーフレームを設定して、球を円状にアニメーションさせる MEL スクリプトを作ってみましょう。

  1. 以下の MEL スクリプトを circleAnimation1.mel という名前で作ります。
    global proc circleAnimation1(float $rad, int $frame)
    {
    	int $i;
    	float $r = 0.0;
    	string $name[];
    
    	$name = `sphere`;
    	setAttr ($name[0] + ".tx") $rad;
    	setAttr ($name[0] + ".rotatePivotX") (-$rad);
    	for($i = 0; $i < $frame;  $i++)
    	{
    		currentTime $i;
    		setAttr ($name[0] + ".ry") $r;
    		setKeyframe -at "ry" $name[0];
    		$r += 10.0;
    	}
    }
    
  2. Script Editor の File → Source Script によって circleAnimation1.mel を読み込みます。
  3. Script Editor から circleAnimation1(5, 100) と打ち込んで実行します。
  4. 半径 5 の円上を球が動いてゆく 100 フレーム分のキーフレームアニメーションが作られます。
    circleAnimation(5, 100)の実行結果

スクリプトの解説

global proc circleAnimation1(float $rad, int $frame)
引数として $rad (円の半径の値)と $frame (キーフレーム数)をとるプロシージャーの宣言です。
int $i;
for 文のカウンタとして使うための変数の宣言です。
float $r = 0.0;
球の回転角度を入れておく変数の宣言です。
string $name[];
球の名前を入れておくための文字列の配列を宣言しています。
$name = `sphere`;
NURBS の球を作成し、その球の名前を配列 $name に代入します。
球のノード名を $name に代入するためにアサインを使用しています。
この時、配列 $name には以下のように代入されます。
setAttr ($name[0] + ".tx") $rad;
$name[0] (球のトランスフォームノード)のアトリビュート(tx)に $rad を設定します。
setAttr ($name[0] + ".rotatePivotX") (-$rad);
$name[0] (球のトランスフォームノード)のアトリビュート(rotatePivotX)に -$rad を設定します。
球の回転の中心をY軸上にしておくために実行しておきます。
for($i = 0; $i < $frame; $i++)
$framefor ループを実行します。
以下は for ループ内の処理の解説です。
currentTime $i;
現在のフレームを $i に設定する。
setAttr ($name[0] + ".ry") $r;
$name[0] (球のトランスフォームノード)のアトリビュート(ry)に $r の値を設定します。
その結果、球が Y 軸周りに $r だけ回転します。
回転の中心は(0, 0, 0)です。
setKeyframe -at "ry" $name[0];
球のトランスフォームノード($name[0])のアトリビュート(ry)にキーフレームを設定します。
ここではキーを設定するアトリビュートは 1 つだけですが、 2 つ以上のアトリビュートを設定する場合は
-at "アトリビュート名"
を必要なだけ記述してゆきます。
もし -at によってアトリビュート名を指定しないと指定されたノードの全てのアトリビュートにキーが設定されます。
また、もしキーを設定するノード(ここでは$name[0])が無いとセレクトされているノードのアトリビュートにキーが設定されます。
$r += 10.0;
球の回転角度($r)に10.0を加えます。

練習

まとめ

練習課題

参考


Prev
Home | Contents
Mail