パーティクル・システム
パーティクル・システム(particle system)とは、ゲーム物理、モーショングラフィックス、コンピュータグラフィックなどで使われる技術のひとつで、たくさんの細かいスプライト画像、3Dモデル、またはその他のCGオブジェクトを使って、ある種の「ファジー(あいまい)」な現象をシミュレートするものである。例えばカオス現象、自然現象、化学反応によるプロセス、などと言った「ファジー」な現象は、これまでのレンダリング技術では再現するのが非常に困難であるが、パーティクル・システムを使うことで表現できるのである。
一般にパーティクル・システムを用いてシミュレーションされる事象の例としては、炎、爆発、煙、流水、火花、落葉、雲、霧、雪、埃、流星、毛髪、毛皮、草地、あるいは光跡や呪文の視覚効果(いわゆる「ゲームのエフェクト」)などが挙げられる。パーティクルシステムのタイプは、パーティクルに寿命が設定されており、寿命が尽きた(フェードアウトした)後にエフェクトの発生源から再放出される「スノーフレーク型」と、パーティクルの生涯(ライフタイム)全体を一度にレンダリングし、パーティクルの1つ1つを撚糸(ストランド)状のオブジェクトとしてレンダリングする「ヘアー型」がある。パーティクルシステムには2Dの物と3Dの物がある。
一般的に、3次元空間におけるパーティクル・システムの位置と動作はエミッター(emitter、放出器)と呼ばれるものによって制御される。エミッターはパーティクルの発生源(ソース)として働き、3次元空間上のエミッターの位置によって、パーティクルがどこで発生しどこへ向かって行くかが決まる。立方体や平面といった普通の3Dメッシュのオブジェクトをエミッターとして使うことができる。
エミッターには、パーティクルのふるまいを制御する一連のパラメータが設定されている。設定できるパラメータの例としては、
発生頻度(スポーンレート) - 単位時間あたりに何個のパーティクルを生成するか
パーティクルの初速度ベクトル - 生成時に放出される方向
パーティクルの寿命 - 各パーティクルが表示されてから消滅するまでの時間の長さ
パーティクルの色、その他いろいろ
などが挙げられる。これらのパラメータの全てもしくは殆どが「ファジーさ」を持つことが一般的である。すなわち、厳密な数値の代わりに、中央値と、その両側に許容される乱数幅を制作者は指定する。(例えばパーティクルの寿命を50±20フレーム内という具合に設定する。)メッシュオブジェクトをエミッターとして使用する場合、初速度ベクトルとしてオブジェクトの各面の法線が設定される場合が多い。この時、パーティクルは各面から直接噴出(スプレー)されるように見えるが、別にそう設定しなくても構わない。
アニメーションの各フレームで実行される、典型的なパーティクル・システムの更新ループは、「パラメータの更新/シミュレーション」と「レンダリング」という2つのステージに分けられる。
シミュレーションのステージにおいては、生成すべき新しいパーティクルの数が発生頻度と更新間隔に基づいて計算され、エミッターの位置と指定された発生領域に応じて、各々のパーティクルは立体空間内の特定の位置に生成される。各々のパーティクルのパラメータ(速度や色など)は、エミッターのパラメータに応じて初期化される。更新が起こるたび、発生済みのパーティクルはその寿命が過ぎていないかチェックされ、過ぎていた場合はシミュレーションから除去される。パーティクルの寿命がまだ過ぎていなかった場合は、パーティクルの位置とその他の属性は物理シミュレーションに従って更新される。ここでの物理シミュレーションは、平行移動のように簡単な場合もあれば、(重力、摩擦、風などの)外力を考慮に入れた物理的に正確な軌道計算のように複雑な場合もある。パーティクルとシーン内の特定の3Dオブジェクトとの間で衝突判定を行って、パーティクルが環境内の障害物に当たって跳ね返ったり、相互に作用したりさせることもよく行われる。パーティクル同士の衝突判定は、計算コストが高く、ほとんどのシミュレーションにおいては視覚的に関連しないため、行われることはほとんどない。
パラメータの更新が完了すると、各パーティクルはテクスチャの貼られたビルボード(常に画面に正対する四角形のスプライト画像)としてレンダリングされる。しかし、ゲームでは必ずしもそこまで高度な処理をする必要が無い場合もある。つまり、解像度が低かったり処理能力の劣った環境では、パーティクルは単一ピクセルの点として描画されることもある。逆に、モーショングラフィックでは、たとえ高解像度で負荷が高い環境でも完全なパーティクルシステムが求められる場合が多い。非リアルタイムのレンダリングでは、パーティクルをメタボールで描画することもできる。メタボールを使ったパーティクルから計算された等値面は、非常にリアルな液体を表現する。さらに言うと、パーティクルの「代用」として3Dメッシュオブジェクトを使うこともできる。すなわち何千何万というパーティクルの位置に合わせて雪片の3Dメッシュオブジェクトを複製し回転させることで吹雪を表現することもできる。
パーティクル・システムには「動的パーティクル」と「静的パーティクル」がある。これは要するに、各パーティクルの「生涯(ライフサイクル、life cycle)」を、時間の経過に応じて分散的に表示するか、一度に表示するかと言う違いである。両者は「スノーフレーク型」と「ヘアー型」として区別される。すなわち動的パーティクルは、空間内の個別の座標を動き回る雪のかけら(スノーフレーク)によく似た見た目を示し、静的パーティクルは、個別の曲線によって構成される髪の毛(ヘアー)によく似た見た目を示す。
パーティクル・システムは、映像制作において火花、雨、火などと言ったパーティクルシミュレーションを作成するためによく使われているので、「パーティクル・システム」という用語に関して「アニメーション」という側面のみを想起しがちである。パーティクルでアニメをする場合の実装では、動画の各フレームにおいては、パーティクルがその生涯の中で特定の座標に位置する瞬間のみが表示され、そのとき各パーティクルは空間内の単一の座標のみを占有する。火や煙など雲散霧消型のエフェクトをかける場合、各パーティクルにはフェードアウト時間または固定時間の寿命が設定され、一方で吹雪や雨などのエフェクトでは、視点から見える範囲の特定の場所を通過するとパーティクルの寿命が終了する。
しかし、各パーティクルの全生涯を一度にレンダリングすると、それは「静的」パーティクルになる。すなわち、パーティクルが点状の粒子ではなく、パーティクルの全生涯における軌道を示した、マテリアルの撚糸(ストランド)として表示される。このようなストランド状の表現は、毛髪、毛皮、草地、などと言ったマテリアルをシミュレートするために利用できる。このストランドは、動的パーティクルが従うのと同じ速度ベクトル、力場、出現頻度、撓みのパラメータで制御できる。加えて、ストランドをレンダリングする時の太さを制御することも可能であり、実装によっては糸の長さに応じて太さを変化させることもできる。パラメータをいろいろと組み合わせることで、硬さ、柔らかさ、重さ、剛毛さ、その他様々な性質を表現できる。エミッタの表面に貼り付けたテクスチャを使って、ストランドの色、長さ、その他のプロパティを変更することもできる。
パーティクルシステムは、ゲームエンジン、デジタルコンテンツ作成システム、エフェクト作成アプリなどに最初から搭載されているが、クリエーターが自力で実装(スクラッチ)することもできるし、別の所からダウンロードした物を使うこともできる。
Havokは複数のパーティクルシステムAPIを提供しており、なかでもHavokFX APIは、特にパーティクルシステムのエフェクトに焦点を当てている。現在はNvidia社の子会社となったAgeiaは、多くのゲームで使われているパーティクルシステムやゲーム物理APIを提供しているが、その中にはUnreal Engine3で制作されたゲームも含まれる。インディーズゲームクリエーターがよく使っているゲームエンジンのGameMaker StudioとUnityはどちらも2Dパーティクルシステムを搭載しているが、残念ながら他のゲームエンジンにインポートすることはできない。他にも多くのソリューションがあるが、標準的ではないエフェクトや動作が必要とされる場合は、クリエーターがパーティクルシステムを自力で作成することもしばしばである。