キーフレームアニメーション
キーフレームアニメーションの手順
MELによるキーフレームアニメーションは以下の手順で作ってゆく。
- オブジェクトを作っておく。
- currentTime で現在の時間を設定する。
- オブジェクトのアトリビュートを変更する。
- setKeyframe でキーフレームを設定する。
- 上の2から4を必要なフレーム数だけ繰り返してアニメーションを作る。
キーフレームアニメーションはキーを設定可能なアトリビュートにのみ有効である。
デフォールトではトランスフォームノードのtranslateX, translateY, translateZ, rotateX, rotateY, rotateZ, scaleX, scaleY, scaleZ, visibility 、コントロールポイントの xValue, yValue, zValue などがキーを設定可能になっている。
もし、デフォールトでキーを設定できないアトリビュートにキーフレームアニメーションをつけるときは
setAttr -k on オブジェクト名.アトリビュート名
によってキーを設定可能にする。
(GUIでは によって行なう)
アニメーションの例
球を円状にアニメーションさせる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[];
- 球の名前を入れておくためのstring(文字列)の配列を宣言。
$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 | Next
Home | Contents
Mail