エクスプレッション
エクスプレッション によるアニメーション
エクスプレッションの機能を使用すると、各オブジェクトのアトリビュートを数式・プロシージャなどでアニメーションさせることができる。
エクスプレッションを定義・編集するにはExpression Editorを使用することが多いが
ここではMELのコマンド(expression)を使用して実行する方法を紹介する。
expressionコマンド
expressionコマンドでは-stringの後にエクスプレッションを
定義するが、その中には単なる数式だけでなく変数を使用やif, while, for, switchなどの制御構造や自分で作ったプロシージャーも使用できるので MELプログラムで表現できることなら、どんな複雑なアニメーションでも定義できる。
expressionの変数
エクスプレッションでは以下の変数を使用して式・プロシージャを作ってゆく。
これらの変数をエクスプレッションで使用する時は、他のMEL変数のように$をつける必要は無い。
- frame
- 現在のフレーム数
- time
- 現在の時間。
現在の設定では1秒あたり30フレーム(NTSC)になっているので 1フレームで1/30 = 0.033秒時間が進む。
expressionコマンドのオプション
- -string "文字列"
- エクスプレッションの式・プロシージャなどを定義する"文字列"を指定する。
- -name string
- stringを、このエクスプレッションの名前にする。
- -object string
- stringを、このエクスプレッションで使うオブジェクトの名前にする。
このオプションで指定された名前はエクスプレッションの中で省略できる。
- -query
- -stringや-nameと共に使用して、それらの値を表示する。
- -edit
- -stringや-nameと共に使用して、それらの値を変更する。
expression コマンドの使用例1
- を表示しておく。
以下のコマンドは から実行する。
- 適当な名前で球を1個作る。
sphere -n sphere1;
- エクスプレッションをexpressionコマンドで定義する。
以下のコマンドはsphere1のアトリビュートの値 translateX を sin関数で変化させる。
expression -string "sphere1.tx = sin(time);";
このコマンドを実行した後 に表示される // Result: の右の expresson1 が、このエクスプレッションの名前になる。
- この後、アニメーションを実行すると球がX軸方向に -1.0 から 1.0 の間を振動する。
- 上のエクスプレッションでは、移動距離が短くてアニメーションさせても動きが良く分からないので、エクスプレッションの定義を変更してみよう。
そのためには-editを使用して以下のようにコマンドを実行する。
(コマンドの最期のexpression1はこのエクスプレッションの名前である。)
expression -edit -string "sphere1.tx = 5 * sin(time);" expression1;
expression コマンドの使用例2
エクスプレッションは Expression Editor によって設定できるが、大量のオブジェクトに設定しようとするとたいへんである。
そのような場合には MELスクリプトを使用すると便利である。
以下の MELスクリプトは指定された個数のコーンを作って、それぞれのコーンに少しづつ違うエクスプレッションの式(Scale Y をアニメーションする)を定義するプロシージャーでる。
- 以下のプロシージャをmakeExpression1.melと言う名前でファイルに書き込む。
global proc makeExpression1(int $num)
{
int $i;
for($i = 0; $i < $num; $i++)
{
string $name[] = `cone`;
move ($i * 2) 0 0;
float $val = $i * 0.3;
expression -object $name[0] -string ("sy = 3 * sin(time + " + $val + ");");
}
}
- でmakeExpression1.melを読み込む。
- で以下のコマンドを実行してみる。
makeExpression1(10);
コ−ンが10個現れて、それぞれにエクスプレッションがつけられている。
アニメーションのレンダリング例
スクリプトの解説
-
global proc makeExpression1(int $num)
- makeExpression1 という名前のプロシージャを宣言する。
引数の $num は作られるコーンの個数を表す。
-
for($i = 0; $i < $num; $i++)
- $i を 0 から 1 づつ増やして $num - 1 になるまで $num 回 for 文を繰り返し実行する。
-
$name = `cone`;
- コーンを作り、その名前を $name に代入しておく。
-
move ($i * 2) 0 0;
- 作ったコーンを X軸方向に $i * 2 だけ移動する。
この式の 2 はコーンの高さ(底から頂点まで)を表す。
また、コマンドの途中に ( ) があると、その ( ) の中を先に計算(実行)してからコマンド全体を実行する。
-
$val = $i * 0.3;
- コーンの動きを少しづつ、づらすために $val に $i * 0.3 の結果を代入しておく。
この式の 0.3 は適当な値なので、別の値にしてもかまわない。
-
expression -object $name[0] -string ("sy = 3 * sin(time + " + $val + ");");
- エクスプレッションの定義。
$name[0] (コーンの名前が入っている)に-string以下の式を定義している。
このエクスプレッションの定義は複雑なので、
-string 以下の部分がどのように実行されるか以下に解説しておく。
- ("sy = 3 * sin(time + " + $val + ");")の外側の括弧内は3つの部分に分かれる。
- "sy = 3 * sin(time + "
- $val
- ");"
この式の sy (Scale Y) は -object で指定された $name[0] (コーンの名前)におけるアトリビュートである。
- まづ、$valの部分が
$val = $i * 0.3;
で計算された値に置き換えられる。
- それから上の3つの部分が+ (文字列を結合する演算子)によってひとつの文字列になり、
エクスプレッションの式として、$name[0] で表されるオブジェクト(cone)に割り当てられる。
具体的に $i が 2 の場合(3個目のコーンの場合)にどのように式が作られるかを見てみよう。
- $val に 2 * 0.3 (0.6)を代入。
($val = $i * 0.3; の部分)
- expressionコマンドの-string以下の ("sy = 3 * sin(time + " + $val + ");") は
("sy = 3 * sin(time + " + 0.6 + ");") となる。
- 式の3つの部分
- "sy = 3 * sin(time + "
- 0.6
- ");"
を + によってひとつの式に結合する。
- 結合された式
sy = 3 * sin(time + 0.6 )
が 3 個目のコーンのエクスプレッション式として定義される。
もし引数 $num が 10 ならば 10 個のコーンに対して、それぞれ以下のエクスプレッションが定義される。
- 1 個目 sy = 3 * sin(time + 0.0 )
- 2 個目 sy = 3 * sin(time + 0.3 )
- 3 個目 sy = 3 * sin(time + 0.6 )
- 4 個目 sy = 3 * sin(time + 0.9 )
- 5 個目 sy = 3 * sin(time + 1.2 )
- 6 個目 sy = 3 * sin(time + 1.5 )
- 7 個目 sy = 3 * sin(time + 1.8 )
- 8 個目 sy = 3 * sin(time + 2.1 )
- 9 個目 sy = 3 * sin(time + 2.4 )
- 10 個目 sy = 3 * sin(time + 2.7 )
練習
- 上の makeExpression1.mel を参考にして makeExpression2.mel を作り、スケールのかかる方向を引数によって変えることができるようにしてみよう。
引数は 2 つで 2 番目の引数( $axis )によってアニメーションの方向を変える。
global proc makeExpression2(int $num, int $axis)
2 番目の引数( $axis )は以下の 1 から 3 の値をとることとする。
(それ以外は無視して良い)
- 1
- X方向にアニメーション
- 2
- Y方向にアニメーション
- 3
- Z方向にアニメーション
参考
練習課題
Prev | Next
Home | Contents
Mail