ThinkingParticles基礎

レベル/対象者:中級/XPressoを少し使える人。
対象ソフトウエア、プラグイン:CINEMA 4D R12 Studio

ルールを使って賢く動かす。

冨士 俊雄/ gtofuji@gmail.com
章番号 題名 内容、及び関連する章 作成日/注記
901 1_TPを作る パーティクルの歴史、TPを作る、TPをグループに入れる、TPにオブジェクトを乗せる、TPを落とす、TPを消す、PBorn、PBlurp、PDraw、PFragment、PMatterWaves、PStorm、PGroup、PPass、ThinkingParticles 設定、パーティクル生成、PDeflector、オブジェクトに対する衝突、PPassAB、PRepulse&Bounce、パーティクル同士の衝突、PShape、PGravity、PGetData、PDie、比較、ベクトル -> 実数、定数 2011.7.11
Previous Top Next

 

Step 1

パーティクルの歴史

 ThinkingParticlesは、CINEMA 4Dに含まれる「パーティクル機能」の一つです。「パーティクル」というのは「粒子」という意味ですが、ここではもう少し広く「多数のオブジェクトを効率よく動かす方法」としておきます。

 さて、ThinkingParticlesをうまく使うには、まずCINEMA 4Dにおけるパーティクル機能の歴史をよく理解しておく必要があります。


1. CINEMA 4D R4以前
 パーティクル機能はなく、多数のオブジェクトを効率よく動かすことはできませんでした。

2. R5
 XLで標準のパーティクル機能が導入され、多数のオブジェクトを効率よく動かせるようになりました。しかし、あまり複雑なことはできませんでした。標準パーティクルの機能はR11.5まで進化せず、現在でもあまり複雑なことはできません。

3. R6〜R7
 COFFEEエクスプレッションが導入され、テキストベースでプログラムを書けばかなり複雑なことができるようになりました。現在でも複雑な表現にはXPressoの中に入っているCOFFEEノードを使います。

 しかし、標準のパーティクルにはCOFFEEと連動するための機能がなく、多数のオブジェクトを動かすために必要な機能を全てプログラムする必要がありました。そのため、作るのが非常に大変でした。

4. R8〜R9
 XPressoとThinkingParticles(XLとStudio)が導入されました。XPressoはノードベースのプログラム環境で、COFFEEノードを使うとテキストベースのプログラムを混在させることもできます。また、ThinkingParticlesはXPressoの中でパーティクルを作るための拡張モジュール(拡張ライブラリ)です。

5. R10〜R12
 多数のオブジェクトを効率よく動かすもう一つの機能として「MoGraph」が導入されました。MoGraphには二つの側面があります。一つは、初心者向けに「プログラムを書かずにXPressoとThinkingParticlesの機能を実現する」こと。もう一つは、上級者向けに「XPressoとThinkingParticlesの機能をさらに拡張すること」です。

 MoGraphは、一見初心者向けの機能に見えますが、至る所でXPressoやThinkingParticlesと連動するようにできています。MoGraphをThinkingParticlesに続く「第二の拡張モジュール」と考えることで、これまでのXPressoやThinkingParticlesを超える表現が可能になります。

 ただし、MoGraphが導入されたことにより、R12からThinkingParticlesはStudioだけに限定された機能になりました。


 このような歴史を鑑みると、現在のCINEMA 4D R12で最も効率のいい方法は、「MoGraphで可能な表現はMoGraphで行い、MoGraphを超える表現についてはXPressoやThinkingParticlesを使う」ということになります。

 したがって、もしあなたがMoGraphに慣れていないのであれば、ThinkingParticlesを勉強する前に、まずMoGraphを勉強することをお勧めします。

 

 

Step 2

ThinkingParticlesを作る

 ThinkingParticlesは非常に強力な機能ですが、「難しい部分は各ユーザが勝手に作る」という構造になっているので、憶えることはそんなにありません。C言語を書いた経験があり、高校程度の数学と物理を理解している人であれば、1日で使えるようになります。

 その後ThinkingParticlesでどのような表現ができるかは、CINEMA 4DやThinkingParticlesの機能に関係なく、「ユーザのアイディアとプログラミング能力次第」というわけです。


 それでは、早速ThinkingParticlesを作ってみましょう。ThinkingParticles(これ以降はTPと省略します)は、XPressoの拡張ライブラリですから、まずXPressoを作る必要があります。

 次に、XPresso編集の空いている部分を右クリックして、「新規ノード -> ThinkingParticles -> TPジェネレータ」からTPを生成するノードを選択します。ここでは標準のパーティクルに似た「PStorm」を選択します。

図901-1

 これでとりあえずTPが生成されました。再生ボタンを押すとパーティクルが出る様子がわかります。

 

 パーティクルを生成するノードについて簡単に説明しておきます。

1. PBlurp
 指定したオブジェクトに含まれるポリゴンを各々TP化します。そして、別に指定したもう一つのオブジェクトに含まれるポリゴンに各々移動させます。言い換えると、オブジェクトをパーティクル化してモーフします。

 生成数や寿命はモーフにしたがって決まるので指定できません。また、特殊なパラメータとして、ポリゴンを断片化する方法や、断片化したポリゴンに厚みを付ける方法などを指定できます。 

2. PBorn
 TPを生成します。指定できるパラメータは、「生成数」と「有効期間(寿命)」だけです。TPを生成するための一番簡単な機能で、一番よく使います。

3. PDraw
 マウスでTPを直接描画します。背景パーティクルを適当に生成する場合などに便利です。生成数や生成フレームは描画時に決まります。その他に「有効期間(寿命)」を指定できます。

4. PFragment
 TP化されたオブジェクトに含まれるポリゴンを各々TP化します。例えば、パーティクルで飛ばした「石」が壁に当たって割れて「破片」が飛び散る、というような表現に使います。

 「有効期間(寿命)」と「速さ」を指定できます。また、特殊なパラメータとして、ポリゴンを断片化する方法や、断片化したポリゴンに厚みを付ける方法などを指定できます。 

5. PMatterWaves
 指定したオブジェクトの表面からTPを生成します。また、この時ライトやテクスチャを使ってTPの「生成数」、「寿命」、「速さ」、「大きさ」、「(オブジェクトから生成位置までの)距離」、「方向」などのパラメータをコントロールできます。

6. PStorm
 基本的な働きは「PBorn」と同じですが、標準パーティクルの「エミッタ」と同じように、「エミッタの位置(及び、スケールや角度)」、「(TPの)速さ」、「(TPの)大きさ」、「(エミッタの)Fov(噴射範囲)」、「(エミッタの)大きさ」、「(エミッタから生成位置までの)距離」、「(TPの)回転」などのパラメータを最初に指定できます。

 

 

Step 3

TPをグループに入れる

 TPを使う上で最も重要な概念は「グループ」です。TPに限らず、一般的にパーティクルというのは「ある操作をくり返し実行する機能」ですが、TPでは「パーティクル全体」ではなく、「パーティクルグループ」に対して操作を指定するのです。

 そして、このグループに含まれるパーティクルは、条件によってどんどん変化していきます。また、グループを階層化することも可能です。このグループを適切に設定することで、非常に複雑なパーティクルの表現が可能になるのです。

 標準パーティクルやMoGraphには、このような「ダイナミックな(どんどん変化する)グループ」という発想がありません。つまり、この「グループ」が標準パーティクルやMoGraphに対するTPの最大の利点だと言えます。

 

 それでは、TPをグループ化してみましょう。TPをグループ化するには、まず「ThinkingParticles 設定」で必要なグループを作成しておく必要があります。グループを作成したら、すぐに適切な「名前」と「カラー」を指定しておきましょう。

図901-2

 

 次に、「PStorm」ノードに「パーティクル生成」ポートを追加し、「PGroup」ノードを接続します。PGroupノードは、パーティクルを指定したグループに入れる働きをします。ThinkingParticles 設定に表示されているグループ(ここでは「init」グループ)をドラッグアンドドロップすると、グループを指定できます。

 この時、一度でうまくグループを指定できず、元に戻ってしまう場合があります。そのような場合は、再度ドラッグアンドドロップして下さい。

 次に「PPass」ノードを作成します。PPassノードは、指定したグループからパーティクルを取り出す働きをします。PGroupノードと同様に、ThinkingParticles 設定に表示されているグループ(ここでは「init」グループ)をドラッグアンドドロップすると、グループを指定できます。

 次に、「PDeflector」ノードを追加します。PDeflectorノードは「オブジェクトに対する衝突」を表現するノードです。衝突するオブジェクト(ここでは「球体」オブジェクト)は、オブジェクトマネージャからPDeflectorノードにドラッグアンドドロップして指定します。ただし、衝突するオブジェクトはポリゴンに限ります。プリミティブやNURBSは衝突判定できません。この点に注意して下さい。

 これで、パーティクルが球体に衝突するようになりました。

図901-3

 

 次に、パーティクルが球体に衝突した時にグループが切り替わるようにします。まず、PGroupノードを複製し、「ON」ポートを追加します。ONポートを追加したノードは、ONポートの値が「真(TRUE)」の時(つまりスイッチが入っている時)だけ働くようになります。

 次に、PDeflectorノードに「イベント」ポートを追加します。イベントポートは、衝突が発生した時だけ「真」の値を出力し、それ以外の時は「偽」を出力します。このイベントポートをPGroupノードのONポートにつなぎます。

 難しい言葉で書きましたが、要はパーティクルが球体にぶつかった時だけPGroupノードを実行し、「after_collide」グループに移しているわけです。エディターを見ると、球体にぶつかったパーティクルの色が赤から緑に変わり、グループ分けが正しく実行されていることが判ったと思います。

図901-4
サンプル901a

 

 パーティクルをグループから取り出すノードには、PPass以外にも「PPassAB」というノードがあります。PPassABノードには、二つのグループに含まれるパーティクルを全て比較し、指定した距離より近いパーティクルだけを出力する、という機能があります。したがって、PPassABと「PRepulse&Bounce」ノードを組み合わせると、「パーティクル同士の衝突」を簡単に表現できます。

図901-5
サンプル901b

 

 

Step 4

TPにオブジェクトを乗せる

 それでは、グループ分けしたパーティクル「after_collide」に対していくつかの処理を追加してみましょう。最初はパーティクルに乗せるオブジェクトを替えてみます。


 TPでパーティクルにオブジェクトを乗せるには、まず「パーティクルジオメトリ」オブジェクトを追加する必要があります。これは一種の「おまじない」と考えて下さい。

 次に、立方体を2個作成し、それぞれに違った色のマテリアルを適用します。

 次に、「PShape」ノードを2個追加し、それぞれに立方体をリンクします。PShapeノードは、パーティクルにオブジェクトを乗せる働きを持っています。そして、「init」をリンクしたPPassノードと、「after_collide」をリンクしたPPassノードにつなぎます。

図901-6
サンプル901c

 これで、パーティクルグループごとに異なった立方体が乗りました。プログラム的には異なったオブジェクトを乗せているわけですが、見た目では「衝突によってパーティクルの色が変わった」ように感じられるはずです。

 ただし、TPではなぜかオブジェクトのサイズが1/10になるので、オリジナルのサイズに合わせたい場合は、PShapeノードの「境界半径」の値を「100」から「10」に変更して下さい。

 

 

Step 5

TPを落とす

 次に、「PGravity」を使ってafter_collideグループを落としてみます。PGravityは、リンクしたオブジェクトのZ軸方向にオブジェクトを落とす働きを持っています。

図901-7
サンプル901d

 この時、衝突する前のパーティクルグループ(init)はPGravityの影響を全く受けていないことに注意して下さい。PGravityは、「オブジェクト」や「領域(減衰)」や「選択範囲(MoGraph選択範囲)」ではなく、「グループ」に対して働いているのです。

 

 

Step 6

TPを消す

 最後に、一般的なXPressoノードを使ってグループを切り替える方法について説明します。

 例えば、PGravityによって落下するafter_collideグループのパーティクルの位置が、「-500」よりも低くなったら消滅するように指定してみます。

図901-8
サンプル901e

 

 そのためには、まず「die」というグループを追加します。

 次に、PGroupとPPassノードを複製し、dieグループをリンクします。

 次に、「PGetData」ノードを作成します。PGetDataノードは、パーティクルの情報を取り出すためのノードです。そして、PGetDataノードに「位置」ポートを追加し、「ベクトル -> 実数」ノードにつなぎます。これはベクトルに含まれる「Y」成分だけを取り出すためです。

 次に、「比較」ノードを作成し、「比較演算子」を「<」に、「入力2」の値を「-500」に指定します。そして、比較ノードの出力をPGroupノードのONポートにつなぎます。

 難しい言葉で書きましたが、要はパーティクルの位置が「-500」よりも低くなったら、PGroupノードを実行し、「die」グループに移しているわけです。


 最後に「PDie」ノードを作成します。PDieノードは、パーティクルを消すノードです。ただし、PDieノードは他のノードと違っていて、デフォルトでは「消さない」ようになっています。したがって、ただつないだだけでは働きません。ONポートを追加し、ここに明示的に「真(TRUE)」の値を指定する必要があります。

 そのために「定数」ノードを追加しています。定数ノードの「データタイプ」を「ブール」に切り替え、チェックボックスをチェックすると、値が「真(TRUE)」に切り替わります。TPならではの面倒な仕様ですが、よく間違うので注意して下さい。

 

Previous Top Next