キーフレームアニメーション
キーフレームアニメーションの手順
MEL によってキーフレームアニメーションを実行する場合は、以下の手順で作ってゆきます。
- currentTime で現在の時間を設定します。
- ノードのアトリビュートを変更します。
- setKeyframe でキーフレームを設定します。
- 上の1から3を必要なフレーム数だけ繰り返します。
キーフレームアニメーションはキーを設定可能なアトリビュートにのみ有効です。
例えば、トランスフォームノードではデフォールトで translateX, translateY, translateZ, rotateX, rotateY, rotateZ, scaleX, scaleY, scaleZ, visibility などがキーを設定可能になっています。
もし、デフォールトでキーを設定できないアトリビュートにキーフレームアニメーションをつけるときは、以下のコマンドによってキーを設定可能にします。
setAttr -k on ノード名.アトリビュート名
GUIでは によって行ないます。
Tips
キーを設定可能なアトリビュートのリストを調べるためには、以下のコマンドを使用します。
listAttr -k ノード名
アニメーションの例
キーフレームを設定して、球を円状にアニメーションさせる MEL スクリプトを作ってみましょう。
- 以下の 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;
}
}
- Script Editor の によって circleAnimation1.mel を読み込みます。
- Script Editor から circleAnimation1(5, 100) と打ち込んで実行します。
- 半径 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 には以下のように代入されます。
- $names[0] にはトランスフォームノードの名前(nurbsSphere1 など)
- $names[1] には球を作るインプットノードの名前(makeNurbsSphere1 など)
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++)
- $frame 回 for ループを実行します。
以下は 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を加えます。
練習
- 上の circleAnimation1.mel を参考にして circleAnimation2.mel を作り、
1 フレームごとの rotateY の値を引数で変えることができるようにしてみましょう。
circleAnimation2(float $rad, int $frame, float $ir)
- $rad
- 円の半径
- $frame
- 総フレーム数
- $ir
- 1フレームごとのratateYの値
- 上の circleAnimation2.mel を参考にして螺旋状に球が動くcircleAnimation3.mel を作ってみましょう。
circleAnimation3(float $rad, int $frame, float $ir, float $iy)
- $rad
- $frame
- $ir
- circleAnimation2 と同じ
- $iy
- 1フレームごとのtranslateYの増減値
circleAnimation3(5, 100, 10, 0.1)の結果
まとめ
- MEL によるキーフレームアニメーションでは currentTime で時間の設定、setKeyframe でキーフレームの設定を行います。
練習課題
参考
Prev
Home | Contents
Mail