« C4D ThinkingParticlesで1枚ポリゴンの木を地面に配置する… | トップページ | C4D 電話機の螺旋コードを作ってみる。 »

C4D ThinkingParticles エミッタとパーティクルグループ

エミッターから放出されたパーティクルを様々な処理を施すためには、パーティクルグループが必要不可欠です。

Tp_106

グループと聞くと、「群れ」の印象が強いのですが、「処理」と考えた方がわかりやすいかもしれません。

全てのパーティクルに施す処理は「All」。

Tp_107

「All」のサブグループに「A」「B」があるならば、「A」に属するパーティクルは、処理「All」と処理「A」を施されるという具合です。
パーティクルが「B」に属するなら、「All」「B」の処理が施されます。

C4D ThinkingParticlesの1つのエミッタから放出されるパーティクルは、「PGroup」ノードで任意のグループに所属させる事ができます。
1つのエミッタから、幾つかのグループに分ける事ができます。

Tp_108
<イメージです。>

勿論、アニメーションの途中でも、グループ間を移動させる事ができます。

Tp_109
<イメージです。>

要するに、パーティクルグループ数とエミッタ数との関係は1:1と言う事ではありません。

C4D ThinkingParticlesのエミッタから放出された後のパーティクルは、エミッタからの関与はありませんし、どのエミッタから放出されたかも知る事ができません。
あくまでもエミッタは放出時のみ、パーティクルに初期値を与えるだけの存在です。
放出後のパーティクルは、グループ毎に処理されるだけです。

では、1つのエミッタから、2つのグループに分けてみましょう。

パーティクルグループは「All」のサブグループに「A」「B」「C」を追加します。

Tp_110

今回のエミッタは「PStorm」を使います。
C4D標準エミッタと同じような物です。
このノードの入力の「エミッタの位置」「エミッタの配置」にヌルオブジェクトの「絶対位置」と「グローバルマトリクス」を繋げます。

Tp_111

これで、ヌルオブジェクトの位置や角度がエミッタに対応します。

「PStorm」の出力「パーティクル生成」にグループを指定する「PGroup」ノードを繋げます。

グループ「A」のみの場合だと、このように繋げます。

Tp_112

では、「PStorm」から放出されるパーティクルをグループ「A」「B」に振り分けます。
今回は「A」:「B」の割合は1:1にします。

この場合、単純に「PStorm:パーティクル生成」を二股にして「PGroup:B」を繋げは良いと言うわけではありません。

Tp_113

先ほどのは、単なるイメージです。

この場合「PGroup」の入力「オン」を使います。
「A:オン」がOnの場合「B:オン」をOffにします。
逆に「A:オン」がOffの場合「B:オン」をOnにします。

Tp_133
<イメージです。>

このOn/Offの値を決めてあげれば良いわけです。

通常パーティクルは管理上、1粒1粒に番号が振られているだろうから、パーティクル番号を偶数と奇数に分けて、On/Offをすると振り分けられそうですが、C4D ThinkingParticlesのエミッタからは、パーティクルの通し番号を出力していません。
「PStorm」の出力には、それらしいものがありますが、この出力はフレームに対しての生成数と生成番号です。

では、このフレームに対しての生成番号を使って偶数と奇数に振り分けて見ます。

まずは、XGroupを使って、入力に「生成番号」、出力に「偶数:ブール」「奇数:ブール」を付けます。
生成番号を2で割った「余」(偶数だと0、奇数だと1)を出力「奇数」へ、「余」を「ブール反転」さてたものを出力「偶数」へ繋ぎます。

Tp_114

これを「PStorm:生成番号」とグループA/Bの「PGroup:オン」に繋げます。

Tp_115

「PGroup」の入力ポートがわかり辛いですが、共に下側が「オン」です。
ノードの連結はこれで終了です。
「PStorm」の生成タイプを「ショット」にし、2を入力します。

Tp_117

こうする事で、各フレームで2個づつ放出されます。
この数値は必ず偶数にしなければ、「A」:「B」が1:1にはなりません。

ビューの結果です。

Tp_116

「TP_Group_01.ZIP」

この、偶数/奇数でのブール出力は、エミッタの出力タイプ「ショット」で、数値が偶数でなければ、意図したグループ分けにはならなくなります。
要するに、1フレームあたりの放出量が2未満の場合、全てが偶数になります。
2の場合は問題ないですが、3の場合だと、「A」:「B」の比率が2:1になってしまいます。

では、設定によって結果の差があまり出ない方法がひとつあります。
放出された順に「On:Off」を切り替えれば良いわけですが。
規則的に切り替えるには、何らかの値を基にしなければいけません。
では、まったく何の数値も基にしない「ランダム」ノードを使って、「On/Off」の切り替えをして見ましょう。

同じくXGroupを使いました。

Tp_118

先ほどと同じく「PGroup」の「オン」に繋ぎます。

Tp_119

これで、「PStorm」のショットの数値が1でも、ほぼ1:1でグループに振り分けられます。

Tp_120

「TP_Group_02.ZIP」

これで、1つのエミッタから2つのグループに振る分ける事ができる事が理解できたと思います。
今回は2つのグループに振る分けましたが、3つでも4つでも振り分けることが可能ですので、是非試してみてください。

では、2つのエミッタを1つのグループを指定します。

先ほどのエミッタを「AA」、これから2つ追加するエミッタを「CC」「DD」とし、グループ「C」を指定します。

Tp_121

Tp_122

結果は問題なく同じグループとして放出されます。

Tp_123

「TP_Group_03.ZIP」

試す程の事ではありませんでした。

では、グループ「A」と「C」に下向きの重力を、「B」には上向きの重力をかけてみましょう。

ここで考える事は、グループ「A」「C」に下向きの重力を掛けることです。
「A」と「C」に、それぞれ処理を追加するのか?

Tp_124

「TP_Group_04.ZIP」

それとも、グループツリーを少々変更して処理を追加するのか?

どちらかをサブグループにし、親になるグループに重力処理を加える。

Tp_125

Tp_126

「TP_Group_05.ZIP」

もしくは、新規のグループを追加し、2つのグループ「A」「C」をサブとし、新規で追加したグループに重力処理を加える。

Tp_127

Tp_128

「TP_Group_06.ZIP」

どちらが望ましいと言う事ではなく、その後の追加する処理しだいで選択は変わってきます。

どちらも、グループ「A」「C」には同じ重力が働きます。

今回は、新規のグループを追加することにしました。

Tp_129

これで、サブグループにも処理が適用される事が理解できたと思います。

では、次に放出されたパーティクルを、アニメーション途中で違うグループに移動させます。
グループを「移動」という言葉を聴くと、画面上パーティクルが移動し「群れる」ようなイメージを持ってしまいますが、「グループ」ではなく「処理」と考え、「処理の移動」考えると良いです。

では、床になるオブジェクトを追加し、グループ「C」のパーティクルが床に衝突した時、グループ「B」へ所属を移動するようにします。

Tp_130

「PDeflector」ノードに床を指定して衝突時に「On」を出力する「イベント」を使います。
パーティクルのグループ指定に使った「PGroup」を使い、パーティクルが床に衝突したときに発生するイベントを「PGroup」の「オン」に入力します。

Tp_131

「TP_Group_07.ZIP」

これで、パーティクルが床に衝突すると「PGroup」にOnが送られ、所属がグループ「B」へ移動します。
Onになったときだけ「B」になるのではなく、「B」へ完全に移動します。

ビューの結果です。

Tp_132
少しわかり辛いですが…

グループ「C」のパーティクルは、床に衝突するとグループ「B」になり「上向きの重力」処理が加えられます。

これで、アニメーションの途中からのグループ移動が理解できたと思います。

全てのグループにパーティクルが指定されているわけではない事を知ってください。

グループ 処理 パーティクル
All 無し 無し
XX 下向き重力 無し
A 無し:「XX」の処理 有り
B 上向き重力 有り
C 無し:「XX」の処理 有り

前回も触れましたが、「PPass」ノードがあるので、床に対しての処理、重力に対しての処理など、オブジェクト毎にXPressoを取り付け設定できます。
不要になったオブジェクトを削除することで、そのオブジェクトに関連のあった処理ごと削除できます。

Tp_134
注)このようなGUIはC4Dにはありません。説明のために加工しました。

ここで言えば「上向きの重力」が不必要になったとき、このオブジェクトを削除すると、グループ「B」に掛けていた処理ごと削除でき、他を修正する必要がありません。

|

« C4D ThinkingParticlesで1枚ポリゴンの木を地面に配置する… | トップページ | C4D 電話機の螺旋コードを作ってみる。 »