チュートリアル > パーティクル フローのスクリプトを作成する > パーティクル フローのパーティクル モーションのシーン オブジェクトへの転送 |
この簡単なチュートリアルでは、パーティクル フローを使用してシーン オブジェクトを動かす方法の基本について説明します。オブジェクトは、ライトからヘルパーおよびメッシュ オブジェクトまであらゆるオブジェクトが対象になります。
この例では、ファイヤ効果を割り当てた大量の周囲効果ギズモを動かして、ティーポットが湯気を立てる様子をシミュレートします。
ChannelsUsed ハンドラは、[スクリプト オペレータ](Script Operator)が使用するチャネルを定義します。 アクセスする必要のあるプロパティを指定せずに、パーティクル コンテナからパーティクル関連の値を取得したり、設定することはできません。このように、パーティクル フローは、[スクリプト オペレータ](Script Operator)にすべてのチャネルを与える必要はなく (パーティクル フローには任意の数のチャネルが存在します)、実際に必要となるチャネルだけを与えます。これによりメモリが節約されます。
パラメータ pCont には、パーティクル コンテナが含まれます。
パーティクルからシーン オブジェクトへの変換をすべてコピーしたいので、そのチャネルに対するアクセスが必要になります。
さらによい結果を得るためには、パーティクルのエージを読み取ってギズモの半径プロパティに割り当て、時間の経過に伴いギズモが拡大するようにします。
Init ハンドラは[スクリプト オペレータ](Script Operator)の初期化に使用します。パラメータ pCont にはパーティクル コンテナが含まれます。
パーティクルが駆動するシーン オブジェクトの配列を入れるグローバル変数を定義します。この場合、共通の基本名を使用して、シーンからすべての SphereGizmo を収集します。
アニメーションの第 1 フレームのシーンからギズモを削除するには、カメラの視野から取り除きます。 ここでは、下の方に移動させます。
[スクリプト オペレータ](Script Operator)がパーティクル フローによって評価されるたびに、Proceed ハンドラが呼び出されます。ハンドラには、スクリプトの実際の本体が含まれています。パラメータ pContには、オペレータの適用先であるすべてのパーティクルを収めたパーティクル コンテナが含まれています。
まず、現在のイベント内のパーティクルの数を読み込みます。イベント内のパーティクル数は 0 の場合も数百万の場合もあります。
次に、パーティクルの数を収集されたギズモの数と比べます。 amin() 関数は、配列内の最小値を返します。
シーン内でパーティクルとギズモのペアが可能な回数だけ、次のコードを繰り返します。
パーティクルからデータを読み込むには、それを現在のものにする必要があります。そのためには、現在のイベントの particleContainer の particleIndex プロパティ にインデックス i を割り当てます。その後、パーティクル関連の問い合わせや割り当ては i 番目のパーティクルだけに対して行われます。
これで、現在の i 番目のパーティクルの変換行列を配列内の i 番目のギズモに割り当てることができます。上記の便利な amin テストのおかげで、i はパーティクルとギズモの数のどちらとも等しいか、それより少ないことが保証されます。
最後に、i 番目のギズモの半径を、10 単位に i 番目のパーティクルのエージの倍を加えたものに変更します。10 はギズモの最小サイズです(particleAge が 0 の場合)。たとえばエージが 10 の場合、ギズモの半径は 30 単位になります。さまざまな値を試してみると、異なる湯気の動きが得られます。