前: 簡単なスクリプト形状 次: テクスチャ形状

3. アニメーション形状

スクリプト形状の特徴で最も重要なもののひとつは、「知的」になれるということです。通常のオブジェクトでは幾何的な定義しかできませんが、スクリプト形状では振る舞いも定義できます。

以下のスクリプトでそれを紹介します。これで「球の雲」がランダムに飛び回るアニメーションを作ります。


r = new Random(0);
t = script.getTime();
for (i = 0; i < 100; i++)
{
  pos = new Vec3();
  Noise.calcVector(pos, r.nextDouble()+t*r.nextDouble(), r.nextDouble()+t*r.nextDouble(), r.nextDouble()+t*r.nextDouble());
  script.addObject(new Sphere(0.05, 0.05, 0.05), new CoordinateSystem(pos, 0, 0, 0));
}

このスクリプトは先のものとほとんどまったく同じですが、違いが2つあります。まず、

t = script.getTime();

を呼び出して、現在の時刻を決定します。これで時間について明快に変化させ、オブジェクトそのものをアニメーション化できます。次に、以下の行で球のそれぞれの位置を決定します。


pos = new Vec3();
Noise.calcVector(pos, r.nextDouble()+t*r.nextDouble(), r.nextDouble()+t*r.nextDouble(), r.nextDouble()+t*r.nextDouble());

Noise クラス(artofillusion.math.Noise)で、乱数ノイズ関数で見積もったスカラーとベクトルを定義します。calcVector() メソッドで、空間中の各点について、ランダムなベクトルをマッピングします。球それぞれについて、r.nextDouble()+t*r.nextDouble() に各要素を設定して、ランダムな開始位置とランダムな方向を選択します。時間ごとにこの位置が「動く」につれ、calcVector() で発生したランダムなベクトルは滑らかに変化します。これで、球の集まりが群れて動く結果となります。

この場合、スクリプトは球それぞれの位置を、時間の関数として明示的に計算しました。これはいつでも便利な方法というわけではありません。例えば、あるスクリプト形状をシーン内のほかのイベントに「反応させる」ようにするとしましょう。イベントの発生時刻をスクリプトにハードコードすることもできますが、これはとても不便です。実際は、スコアを通して簡単に制御できるよう、変化をキーフレームできるようにしたいところです。

これをするには、スクリプトパラメータ を定義します。スクリプト形状から「編集...」を選択して、「パラメータ...」ボタンをクリックしてください。「追加」をクリックして新規のパラメータを追加して、名前に "radius"(半径)と入力、強度には 0.05 を入力します。そして OK をクリックしてください。

次に以下のスクリプトを入力します。

これで先の第2章での最初のスクリプトとまったく同じ「球の雲」が作られますが、重要な違いがあります。このスクリプト形状にポーズトラックを追加すると、radius パラメータの値をキーフレームできます。

パラメータを使うと、スクリプトオブジェクトをさまざまに異なる切り口で制御でき、複雑なアニメーションも簡単に作れます。

前: 簡単なスクリプト形状 次: テクスチャ形状