キーフレームアニメーション
キーフレームアニメーションの手順
MEL によってキーフレームアニメーションを実行する場合は、以下の手順で作ってゆきます。
- currentTime によって、
現在の時間を設定します。
- ノードのアトリビュートを変更します。
- setKeyframe によって、
キーフレームを設定します。
- 上の 1 から 3 を、必要なフレーム数だけ繰り返します。
キーフレームアニメーションは、キーを設定可能なアトリビュートにのみ有効です。
たとえば、トランスフォームノードではデフォールトで 移動 X, 移動 Y, 移動 Z, 回転 X, 回転 Y, 回転 Z, スケール X, スケール Y, スケール Z, 可視性 などがキーを設定可能になっています。
もし、デフォールトでキーを設定できないアトリビュートにキーフレームアニメーションをつけるときは、以下のコマンドによってキーを設定可能にします。
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;
}
}
- スクリプト エディタ の によって circleAnimation1.mel を読み込みます。
- スクリプト エディタ のインプットウインドウに 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 フレームごとの 回転 Y の値を引数で変えることができるようにしてみましょう。
circleAnimation2(float $rad, int $frame, float $ir)
- $rad
- 円の半径
- $frame
- 総フレーム数
- $ir
- 1フレームごとの 回転Y の値
- 上の circleAnimation2.mel を参考にして、
螺旋状に球体が動く circleAnimation3.mel を作ってみましょう。
circleAnimation3(float $rad, int $frame, float $ir, float $iy)
- $rad
- $frame
- $ir
- circleAnimation2 と同じ
- $iy
- 1フレームごとの 移動 Y の増減値
circleAnimation3(5, 100, 10, 0.1)の結果
まとめ
- MEL によってキーフレームアニメーションを設定するときは、以下のコマンドを使用します。
- currentTime
- 時間の設定
- setKeyframe
- キーフレームの設定
練習課題
参考
Prev | Next
Home | Contents
Mail