SeminarThinkingParticles基礎レベル/対象者:中級/XPressoを少し使える人。Studioルールを使って賢く動かす。1TPの位置を指定する、オブジェクトからこの章では、TPが発生する位置を指定する方法について順番に説明します。簡単なのは「オブジェクト(の原点)」から発生する場合です。「位置」の情報が一個しかないからです。他の方法も結局同じ処理をくり返しているだけで、基本的な考え方は変わりません。それでは、まずTPを作成し、「init」グループに入れて下さい。今回は生成位置を指定するので、「PBorn」ノードを使います。PBornはただTPを生成するノードです。「PStorm」ノードなど他のTP生成ノードを使って初期位置や初期速度を与えても、それらは全て上書きされてしまうので無駄になります。図902-1次に、initグループの「PPass」ノードを「PSetData」ノードに接続します。PSetDataノードは、パーティクルのいろいろなパラメータを指定する働きを持っています。今回はこのノードを使って「位置」の値を指定するわけです。位置の値は、「target」オブジェクトから取り出します。同時に、「PGroup」を使ってパーティクルグループを「init」から「flow」に切り替えます。この切り替えをしないとパーティクルを自由に動かせません。initグループにあるパーティクルは、毎フレームごとにtargetオブジェクトに移動し、言ってみれば「拘束されている」からです。これでアニメーションを再生し、targetオブジェクトを動かすと、パーティクルがオブジェクトの軌跡の上に残ることがわかります。図902-2サンプル902aこれはさすがに簡単なので、標準のパーティクルでもMoGraphでもできます。今回使ったPSetDataノードは、901章で使ったPGetDataノードと対になるノードで、非常によく使います。TPにユーザが独自にパラメータを追加することもできます。設定」ウインドウで作成できます。このデータチャンネルの値を指定する時にはPSetDataノードを使います。データチャンネルの値を取り出す時にはPGetDataノードを使います。2TPの位置を指定する、表面から次に、ポリゴンオブジェクトの表面からTPを発生させる方法について説明します。TPを作ってinitグループに入れるところまではステップ1と同じなので省略します。initグループの「PPass」ノードを「PSetData」ノードに接続します。次に、「PSurfacePosition」ノードを追加します。PSurfacePositionノードは、指定したポリゴンオブジェクトの表面の位置をランダムに取り出す働きを持っています。ここでは、「トーラス」オブジェクトをリンクしています。PSurfacePositionは、プリミティブやNURBSは扱えないので注意して下さい。ステップ1の場合と違って、PSurfacePositionノードにもPPassから「パーティクル生成」ポートがつながっている点に注意して下さい。パーティクル生成ポートから出力されている値の正体はパーティクルの番号を表すユニークな(重複のない)整数で、これを元にしてランダムな値を生成し、パーティクルごとに発生する位置を変えているのです。このポートをつながなければ、ランダムな値が変化しないので、全てのパーティクルが同じ場所に生成されることになります。最後に、パーティクルグループをinitからflowに切り替えます。図902-3サンプル902bこれで、パーティクルがオブジェクトの表面に生成されるようになりました。細かいことを言うと、実際にPBornがパーティクルを生成しているのはワールドの原点です。同じフレームの中で指定したオブジェクトの表面に移動されるので、見た目にはオブジェクトの表面から発生しているように感じられます。PSurfacePositionは、オブジェクトの「表面」だけではなく「ポイント」や「エッジ」からパーティクルを生成させることもできます。ポリゴン選択範囲を使って生成する領域を制限することもできます。この表現は、標準のパーティクルではできません。MoGraphでは、表面に発生させたクローンをダイナミクスを使って飛ばすのは簡単ですが、逆に「ダイナミクスで表面に吸い付かせる」という表現は、COFFEEを使ってプログラムを書かない限り無理です。TPの場合でも、表面に吸い付かせるためにはプログラムを書く必要があります。TPはそもそもプログラムを書くのが前提なので、そんなに違和感なく作ることができます。したがって、このような表現にはTPを使うか、もしくはTPとMoGraphを組み合わせるといいでしょう。3TPの位置を指定する、内部から次に、ポリゴンオブジェクトの内部からTPを発生させる方法について説明します。作り方や性質はステップ2とほとんど同じです。TPを作ってinitグループに入れるところまではステップ1と同じなので省略します。initグループの「PPass」ノードを「PSetData」ノードに接続します。次に、「PVolumePosition」ノードを追加します。PVolumePositionノードは、指定したポリゴンオブジェクトの内部の位置をランダムに取り出す働きを持っています。ここでは、「space(立方体)」オブジェクトをリンクしています。PVolumePositionは、PSurfaePositionと同様にプリミティブやNURBSを扱えないので注意して下さい。最後に、パーティクルグループをinitからflowに切り替えます。図902-4サンプル902cこれで、パーティクルがオブジェクトの内部に生成されるようになりました。PVolumePositionは、オブジェクトの「内部」だけではなく「外部」にパーティクルを生成させることもできます。生成する深さ(表面からの距離)を制限したり、ポリゴン選択範囲を使って生成する領域を制限することもできます。この表現は、標準のパーティクルではできません。MoGraphでは、クローンをスプライン上に発生させるのは簡単ですが、TP程の自由度はありません。MoGraphだけでは表現できないと感じたら、TPを使うことを考えるといいでしょう。4TPの位置を指定する、スプラインから最後に、スプライン上からTPを発生させる方法について説明します。実はこれが一番面倒です。専用のノードがないので、XPressoで全部作らなければならないからです。TPを作ってinitグループに入れるところまではステップ1と同じなので省略します。initグループの「PPass」ノードを「PSetData」ノードに接続します。次に、「スプライン」ノードを追加します。スプラインノードを使うと、指定したスプラインの位置や接線を取り出すことができます。ここでは、「星形」スプラインをリンクしています。次に「ランダム」ノードを追加します。ランダムノードは、ランダムな値(乱数)を生成します。面倒ですが、このランダムノードを使わないと、パーティクルをスプライン上に「分散」させることができません。ランダムノードの出力は「実数」とし、「絶対値」のオプションをチェックします。すると、ランダムノードは「0.0〜1.0」の間の値をランダムに出力するようになります。この値はスプラインの「始点〜終点」に対応しています。「計算」ノードを追加し、ランダムノードの前につなぎます。計算ノードの働きは、ランダムノードの値を「より分散させる」ことです。計算ノードを挟まなくてもランダムノードは動作しますが、PPassから出力される値が非常に近いため、規則性が目立ちます。最後に、パーティクルグループをinitからflowに切り替えます。図902-5サンプル902dこれで、パーティクルがスプラインから生成されるようになりました。この表現は、標準のパーティクルではできません。MoGraphでは、クローンをスプライン上に発生させるのは簡単ですが、TP程の自由度はありません。