« C4D ThinkingParticles 簡単なスプラインエミッタを作ってみる -02「ごめんなさいスプラインエミッタ」… | トップページ | C4D ThinkingParticles ポリゴンオブジェクト内にパーティクルを配置する-02 »

C4D ThinkingParticles ポリゴンオブジェクト内にパーティクルを配置する。

前回のスプラインエミッタの作成で、TPジェネレータ「PBorn」ノードを使ってパーティクルを生成し、「PSetData」ノードで位置や放出方向を与えパーティクルを飛ばしました。

これと同じように、「PBorn」ノードで生成したパーティクルをポリゴンオブジェクト内に配置します。
スプラインエミッタの場合は、XPresso一般「スプライン」ノードを使ってスプライン上のグローバル座標を取得しました。
ポリゴンオブジェクトの内側のグローバル座標を取得するには、ThinkingParticlesのTPヘルプ「PVolumePosition」ノードを使います。

では、必要最小限で…
下のように配置します。

Pvolumeposition_01

今回は、放出系ではなく生成されたパーティクルをポリゴンオブジェクト内に配置します。
パーティクルグループは下のように設定しました。「All」だけでもかまいません。

Pvolumeposition_02

シーンの構成は、こんな具合。

Pvolumeposition_11

では、下のポリゴン内にパーティクルを配置します。

Pvolumeposition_03

C4D ThinkingParticles構築のXPressoです。

0Fで4000個のパーティクルをポリゴンオブジェクト「CINEMA 4D」内に生成します。

Pvolumeposition_04

まずは、0Fで「On」、それ以外は「Off」を「PBorn」ノードへ入力するためのノードです。
「時間」ノードのフレームを0と比較します。

「PBorn」ノードを追加し、入力「オン」と連結します。

Pvolumeposition_05

「PBorn」の「生成タイプ」は「ショット」、数は4000です。

「PVolumePosition」ノードを追加し、ポリゴンオブジェクト「CINEMA 4D」を指定します。
「PBorn」ノードの「パーティクル生成」と「PVolumePosition」を連結します。

Pvolumeposition_06

「PVolumePosition」ノードは、送られてきたパーティクルの数だけ、ポリゴンオブジェクト「CINEMA 4D」からポリゴンオブジェクト内のランダムなグローバル座標を出力します。

「PSetData」ノードで「PBorn」ノードの「パーティクル生成」から送られてくるパーティクルに座標を設定します。

Pvolumeposition_07

ジェネレータから生成された時のみ、パーティクルに位置を割り振っているので、アニメーション中にポリゴンオブジェクトを移動しても、パーティクルは追従しません。

では、パーティクルにオブジェクトを「PShape」ノードで割り付けます。

Pvolumeposition_08

「PSetData」ノードで、大きさとパーティクルグループを設定します。
大きさは「定数」ノードを使い、パーティクルグループは「PGroup」ノードを使いグループ「A」を設定します。

Pvolumeposition_09

これで、ポリゴンオブジェクト内にパーティクルを大きさ/グループを指定し生成ができます。

「パーティクルジオメトリ」を追加し終了です。

Pvolumeposition_10

ポリゴンオブジェクト「CINEMA 4D」は非表示にしま。

「PVolumePosition_01.ZIP」

では、配置されたパーティクルの塊「CINEMA 4D」を左の方から徐々に重力を適用してみましょう。

いきなりグループ「A」に重力を適用させると、全てのパーティクルが重力方向へ移動を開始してしまいます。

Pvolumeposition_13

こう言う時は、エリアを設定します。
エリアを移動させ範囲内に入ったパーティクルに処理を施します。

使うノードは「PLight」ノードです。
このノードは、「指定した位置がライトに照らされているかどうか…」とヘルプには書いてあったような気がしますが、「照らされている」のではなく、ライトの「有効範囲に入っているか?」を判断します。
要するに、指定した位置とライトの間にオブジェクトがあって、指定した座標が影の領域になっていてもエリア内なら「On」を出力します。
ただし、ライトの強度は関係しています。
強度が0.0の場合はライトの領域内でも「Off」になります。
「表示」「非表示」は全く関係ありません。

「PLight」ノードには、パラメータが幾つかありますが、今回は「しきい値」0.0で使用します。

エリア指定で使用するので、スポットライトを使います。

では、XPressoです。

Pvolumeposition_12

「PPass」でグループ「A」のパーティクルを抽出し、「PGetData」でパーティクルの座標を取得します。
取得した位置を「PLight」で指定したライトと比較し、有効範囲内だと「On」を出力します。
最後に、「PGravity」で有効範囲内のパーティクルに重力を適用します。

あとは、ライトを左から右へ移動するキーフレームを打ち込めば完成です。

下に落ちライトの有効範囲外になったパーティクルは、重力加速はしないものの下に落ち続けます。

「PVolumePosition_02.ZIP」

下に落ち始め、ライトの範囲外になっても重力加速を続けさせるのであれば
パーティクルグループ「B」を追加し、「B」に所属する全てのパーティクルに無条件で重力を適用します。
グループ「A」のパーティクルがライトの有効範囲に入ったときに、グループ「B」へ移籍させます。

パーティクルグループ

Pvolumeposition_14

グループの移籍

Pvolumeposition_15

重力

Pvolumeposition_16

実行すると、こんな具合さ…

Pvolumeposition_17

「PVolumePosition_03.ZIP」

では、1文字づつ落下させたい場合は…

制作方法は、何通りかはありますが…
この方法がベストと言う訳ではありません。

1文字づつのパーティクルグループと重力落下用グループを作成しました。

Pvolumeposition_18

Pvolumeposition_19

任意の時間がきたら、それぞれのグループから落下のグループに移籍するだけ…
後は、落下するだけ…

Pvolumeposition_20

シーンの構成は…

Pvolumeposition_21

ポリゴンオブジェクト「CINEMA 4D」を1文字づつ選択範囲を設定しました。
この選択範囲を使って「PVolumePosition」ノードでポリゴンの内側のグローバル座標を取得します。

ヌルオブジェクト「VolumePosition」のXPressoのTPジェネレータ周りから…

Pvolumeposition_22

かなり分かり辛くなりました…
簡単に説明します。
「PBorn」の生成数と生成番号を使い文字数8でパーティクルを8等分しています。0~7までの数値を作成しました。
この0~7までの数値をスイッチにし「条件分岐」ノードを使い、ポリゴンオブジェクト「CINEMA 4D」の選択範囲を選別します。
同じ数値を使い、パーティクルに適用するパーティクルグループも「条件分岐」ノードを使い選別します。
選別された選択範囲は「PVolumePosition」ノードで選択範囲内のポリゴン内のグローバル座標を取得します。
取得したものは「PSetData」でパーティクルに適用します。

選択範囲毎にTPジェネレータを使った方がわかりやすいだろうか?

ポリゴンオブジェクト「床」に取り付けたXPressoです。

Pvolumeposition_23

落下用グループ「g」のパーティクルは「PDeflector」ノードでポリゴンオブジェクト「床」に反射します。
グループ「g」のみ「PPassAB」で抽出され「PRepulse&Bounce」ノードでパーティクルの衝突反射します。

ヌルオブジェクト「落下のタイミング」のXPressoです。

Pvolumeposition_24

今回は、落下のタイミングをキーフレームを使わず、XPressoのノードで指定しています。
アニメーション開始から30Fで「C」の文字が落下を開始します。他の文字も10Fおきに落下を開始します。
全てのグループは、指定した任意のフレームが訪れるとグループ「g」へ移籍します。

「指定したフレームにOn」の中身です。

Pvolumeposition_26

「時間」ノードと「比較」ノードのみのXGroupです。

ヌルオブジェクト「重力」に取り付けられたXPressoです。

Pvolumeposition_25

グループ「g」は常に落下します。

「PVolumePosition_04.ZIP」

同じシーンを1文字づつポリゴンを分割し、「PBorn」ノードを1:1で取り付けました。
動きは全く同じです。

Pvolumeposition_27

ヌルオブジェクト「VolumePosition」に取り付けたXPressoは、パーティクルを生成させる為に、各「PBorn」に「On/Off」を送ります。
正確には、ヌルオブジェクト「VP_C」等のユーザデータに送っています。

Pvolumeposition_28

ヌルオブジェクト「VP_C」等のXPressoは、一文字づつの「PBorn」ノードを格納しています。
これらにユーザデータを使い、指定します。

Pvolumeposition_29

ユーザデータは見ての通りです。

取り付けたXPressoです。

Pvolumeposition_30

ユーザデータ「パーティクルグループ」のタイプは「リンク」です。
「PSetData」の「グループ」のタイプは「TP Group」です。
このポートは直接連結する事ができないので、TPヘルプ「PGroup」を中継しています。

XGroup「VolumePosition」の中身です。

Pvolumeposition_31

前のシーンファイルと同じ構造なので、説明するほどではありません。

この他のXPressoは前のシーンファイルと同じです。
グループ「g」の重力、床の反射、パーティクル同士の衝突反射。
グループ「g」以外のグループの落下のタイミングです。

「PVolumePosition_05.ZIP」

これで、なんとなく「PVolumePosition」の使い方が分かっただろうか…

C4D ThinkingParticlesネタは、このまま続けていても良いのだろうか…?
全てのユーザが導入しているわけではないしなぁ…

|

« C4D ThinkingParticles 簡単なスプラインエミッタを作ってみる -02「ごめんなさいスプラインエミッタ」… | トップページ | C4D ThinkingParticles ポリゴンオブジェクト内にパーティクルを配置する-02 »