エクスプレッション

エクスプレッション によるアニメーション

エクスプレッションの機能を使用すると、各オブジェクトのアトリビュートを数式・プロシージャなどでアニメーションさせることができる。
エクスプレッションを定義・編集するには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. Script Editor を表示しておく。
    以下のコマンドはScript Editor から実行する。
  2. 適当な名前で球を1個作る。
    sphere -n sphere1;
    [sphere コマンドの実行]
  3. エクスプレッションをexpressionコマンドで定義する。
    以下のコマンドはsphere1のアトリビュートの値 translateX を sin関数で変化させる。
    expression -string "sphere1.tx = sin(time);";
    [expression コマンドの実行前]
    このコマンドを実行した後 Script Editor に表示される // Result: の右の expresson1 が、このエクスプレッションの名前になる。
    [expression コマンドの実行後]
  4. この後、アニメーションを実行すると球がX軸方向に -1.0 から 1.0 の間を振動する。
  5. 上のエクスプレッションでは、移動距離が短くてアニメーションさせても動きが良く分からないので、エクスプレッションの定義を変更してみよう。
    そのためには-editを使用して以下のようにコマンドを実行する。
    (コマンドの最期のexpression1はこのエクスプレッションの名前である。)
    expression -edit -string "sphere1.tx = 5 * sin(time);" expression1;
    [expression コマンドの実行前]
    [expression コマンドの実行前]

expression コマンドの使用例2

エクスプレッションは Expression Editor によって設定できるが、大量のオブジェクトに設定しようとするとたいへんである。 そのような場合には MELスクリプトを使用すると便利である。

以下の MELスクリプトは指定された個数のコーンを作って、それぞれのコーンに少しづつ違うエクスプレッションの式(Scale Y をアニメーションする)を定義するプロシージャーでる。

  1. 以下のプロシージャを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 + ");");
    	}
    }
    
  2. File → Source Script でmakeExpression1.melを読み込む。
  3. Script Editor で以下のコマンドを実行してみる。
    makeExpression1(10);
    コ−ンが10個現れて、それぞれにエクスプレッションがつけられている。
    [makeExpression1(10) の実行後]
    アニメーションのレンダリング例

スクリプトの解説

global proc makeExpression1(int $num)
makeExpression1 という名前のプロシージャを宣言する。
引数の $num は作られるコーンの個数を表す。
for($i = 0; $i < $num; $i++)
$i を 0 から 1 づつ増やして $num - 1 になるまで $numfor 文を繰り返し実行する。
$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 以下の部分がどのように実行されるか以下に解説しておく。
  1. ("sy = 3 * sin(time + " + $val + ");")の外側の括弧内は3つの部分に分かれる。
    • "sy = 3 * sin(time + "
    • $val
    • ");"
    この式の sy (Scale Y) は -object で指定された $name[0] (コーンの名前)におけるアトリビュートである。
  2. まづ、$valの部分が $val = $i * 0.3;で計算された値に置き換えられる。
  3. それから上の3つの部分が+ (文字列を結合する演算子)によってひとつの文字列になり、 エクスプレッションの式として、$name[0] で表されるオブジェクト(cone)に割り当てられる。
具体的に $i が 2 の場合(3個目のコーンの場合)にどのように式が作られるかを見てみよう。
  1. $val2 * 0.3 (0.6)を代入。
    ($val = $i * 0.3; の部分)
  2. expressionコマンドの-string以下の ("sy = 3 * sin(time + " + $val + ");")("sy = 3 * sin(time + " + 0.6 + ");") となる。
  3. 式の3つの部分
    • "sy = 3 * sin(time + "
    • 0.6
    • ");"
    を + によってひとつの式に結合する。
  4. 結合された式 sy = 3 * sin(time + 0.6 ) が 3 個目のコーンのエクスプレッション式として定義される。
もし引数 $num が 10 ならば 10 個のコーンに対して、それぞれ以下のエクスプレッションが定義される。

練習

参考

練習課題


Prev | Next
Home | Contents
Mail