Sprite Particles

ここではパーティクルでスプライトを扱う方法を以下の順に紹介する。

  1. スプライトシートの作成 (別ページ)
  2. パーティクルの作成
  3. スプライトの追加
  4. スプライトのコントロール
  5. レンダリング
  6. Mplay による QuickTime 出力 (別ページ)

元になっているのは、Peter Quint 氏によるこちらのビデオ

使用したバージョン: 14.0.361
シーンファイルへのリンクは一番下にあり。

1. パーティクルの作成

  1. Particles シェルフから Ctrl キーを押しながら Location Particle Emitter を実行。再生すれば、原点からパーティクルが発生し、落下する様子がわかる。/obj/AutoDopNetwork 以下で、
    1. gravity1 ノードのバイパスフラグをオンにし(黄色くする)、重力の影響を無効にする。
    2. location ノードの Const. Birth Rate を 10 などにして、発生するパーティクルの数を減らす。

    これにスプライトを追加する。

2. スプライトの追加

  1. 同じく Particles シェルフの右奥から (右三角を押してスクロール) Sprite Particles ()を探し、実行。
    • location と popsolver1 の間に popsprite1 ノードが挿入され、ビューポートでは煙の塊のようなスプライトが表示される(はず @ 72フレーム目)。

      もし表示されない場合、ビューポート内で 'd' キーを押し、Display Options パネルを表示、Geometry タブ以下の Particles 以下、Display Sprites がオンになっているかを確認(下の画像の赤線部分)。
  2. popsprite1 ノードを選択、Sprite Map に先ほど作った spritesheet.pic を指定。巻き戻せば次のようにスプライトが表示される。
  3. popsprite1 ノードのパラメータを以下のように設定する。
    1. Mode を Offset/Size から Sprite Sheet に変更。
    2. Rows and Columns を 3 と 3 に変更。
    3. Sprite Scale を (大きすぎるので) 0.2, 0.2 に変更。
    4. Sprite Index 値を 0 から 8 の間で変更すればそれぞれのスプライトが表示される。
      例えば Sprite Index を 8 にして再生すれば、次のようになる (59フレーム目)。

2. スプライトのコントロール

パーティクルごとに別のスプライトをアサインしたり、スプライトのアニメーションを行うには、VEX というエクスプレッションを使う。

  1. popsprite1 の Use VEXpressions をオンにする。
  2. 表示されたテキストフィールドの右側の▽をクリックし、Pass Through を実行。

    次のようにここで使えるVEXのテンプレートが表示される。

    このまま再生しても特に再生されるパーティクルに変更は無い。
  3. textureindex = textureindex; textureindex = i@age; と変更。これにより、テクスチャインデックスが各パーティクルのage (年齢)によって決定される。
    • '@' は各パーティクルの age アトリビュートを参照するということを示す指示詞。
    • 先頭の 'i' は、元々浮動小数点で定義されている age を整数にキャストしている。こうするのは、textureindex が整数を期待しているから。

    時間の経過とともにスプライトがアニメーションして行くのがわかる。ただしこのままでは発生したばかりのパーティクルは常にインデックス 0。
  4. textureindex = i@age とした行を textureindex = @id; と変更。これにより、テクスチャインデックスが各パーティクルのIDによって決定される。
    • id は整数なので i@id とする必要はない。

    ビューポート右横のDisplay Point Number ボタンをオンにすれば、各パーティクルのIDをビューポート上に表示可能(@30フレーム目)。
  5. textureindex = @id textureindex = floor(rand(@id)*10); と変更。これにより、パーティクルIDを元にしたランダム数によって決定される。
    • rand(@id) により[0, 1.0]の間でランダム数が作られ
    • *10 で [0, 10.0] の間にスケールされ (fit関数を使っても良い)
    • floor を使うことで各値に対する最大の整数に変換 (例: 1.1->1、 8.9->8 等)
  6. よって発生時にランダムのインデックスを指定し、その後アニメーションしていくには今の二つを両方使う。そのためには、
    textureindex = floor(rand(@id)*10 + @age);
    とする。

4. レンダリング

  1. Create シェルフから Grid を Ctrl キーを押しながら実行。これによる影の落ちる地面が出来る。
  2. Lights and Cameras シェルフから Camera をクリック。レンダリング用のカメラ作成。
  3. 同じく Lights and Cameras シェルフから Distant Light を Ctrl キーを押しながらクリック。適当な位置・角度に配置。終わった後は cam1 に戻る。
  4. Render View に行き、 Render ボタンを押してレンダリングを実行。

    影もアルファチャネルを使って正しくレンダリングされているのがわかる。

まとめ

  • スプライトシートの作成方法はこちら
  • パーティクルにスプライトを追加するには、Particles シェルフの Sprite Particles ツールを使用。
  • Mode を Sprite Sheet にすることで複数画像を効率良く扱うことが出来る。
  • 細かい設定は VEX を用いる。
  • アルファを持つテクスチャを使えばアルファを使った影の処理はMantraで可能。
  • Mplay による QuickTime 出力方法はこちら

シーンファイル:

0 件のコメント:

コメントを投稿