« C4D ThinkingParticles パーティクルの速度ベクトル… | トップページ | C4D ThinkingParticlesでC4D標準パーティクルのようにオブジェクトをランダムに適用する »

C4D ThinkingParticles 壁の表層をパーティクルで粉砕する。

「C4D ThinkingParticles パーティクルを粉砕させる… PFragmentではなく…01/02」
「C4D ThinkingParticles パーティクルをポリゴンに衝突させて、ポリゴンを簡易的に凹ませる…」
この2種類の記事の応用で、壁の表層をパーティクルで粉砕します。

あくまでも、表層のみです。
ポリゴン操作ではなく、マテリアル対応、「変位マップ」「プロクシマル」なので…

では、今回のパーティクルグループ構成です。

Tpfragwall_14

エミッタから、グループ「A」を放出します。
ポリゴンに衝突するとグループ「A」から「B」へ移籍し、「プロクシマル」用にポリゴン表面に留まります。
ポリゴンとの衝突位置から、壁の粉砕用パーティクル「C」が、煙用パーティクル「D」が放出されます。

難しい事はなく… 問題ないですね。
今回も、C4D ThinkingParticles重視で進めます。

パーティクルグループです。

Tpfragwall_17

シーンの構成です。

Tpfragwall_20

では、グループ「A」のエミッタ部分です。

Tpfragwall_21

グループ「A」のパーティクルは、ポリゴンに衝突すると、「プロクシマル」用のグループ「B」に速度0.0で移籍します。

Tpfragwall_22_2

グループ「A」に適用したオブジェクトを進行方向に向けるために、「PRoling」ノードを使いました。
ポリゴンとの衝突判定に「PDeflector」ノードを使いました。
「PDeflector」ノードの「イベント法線」「イベント位置」はグループ「C」「D」の処理に繋ぎます。

グループ「A」がポリゴンに衝突した位置から法線方向を基準に、グループ「C」「D」を放出します。

まずはグループ「C」のパートです。

Tpfragwall_25

衝突イベントを受けてTPジェネレータ「PBorn」ノードが作動します。
「PVelocity」ノードで方向と速度を…
「PGetData」ノードでランダムシードを取得してパーティクルの大きさをランダムで与えています。

グループ「D」のパートです。

Tpfragwall_26

グループ「D」は煙でPyroClusterを使うので、一回の衝突で1粒だけ法線方向に放出します。

この衝突処理絡みのグループ「A」「B」「C」「D」のXPressoは1つのタグで処理しました。

Tpfragwall_27

それ程複雑な回路ではないので、後から見て分からなくなっても解析には時間は掛からないでしょうが…
グループ毎に分ける方法があります。
先ほど表示したように、「PDeflector」をそれぞれに適用し、グループ「C」「D」は「イベントのみ」のフラグをOnにする…
同じ処理を繰り返すので、あまりスマートではない処理のしかただと思います…

この方法は使いません。
他の方法は後ほど… では、続いて…

グループ「C」は壁の破片なので、下向きの重力と回転をかけます。

Tpfragwall_23_2

グループ「D」は煙なので上向きの重力と摩擦もかけます。

Tpfragwall_24

この状態で再生しますと…

Tpfragwall_28

赤のパーティクルが衝突すると静止し緑色になり、青の破片パーティクル数個とマジェンタ色の煙パーティクル1個が生成されます。

では、「パーティクルジオメトリ」を追加しますが、グループ「D」には、PyroClusterを適用します。
残りの「A」「C」はオブジェクトを…
「B」はマテリアルの「プロクシマル」に適用します。

この様に、グループ毎に使用用途が異なる場合、「パーティクルジオメトリ」は「All」を指定することができません。

Tpfragwall_29

今回はグループ毎に別々に指定することになります。

Tpfragwall_30

弾丸「A」と破片「C」には、モーションブラー
煙「D」には、PyroCluster
「B」は実体化させずに「プロクシマル」に適用します。

Tpfragwall_31

でも「パーティクルジオメトリ」を沢山増やしてもなぁ…なんて思うユーザもいることでしょう…
そんな時は、パーティクルグループを編集します。

今回、パーティクルに適用したオブジェクトとして実体化するグループは「A」「C」です。
両方ともモーションブラーが掛かっているので、条件が同じです。
この「A」「C」を親とするグループ「AC」を追加し、そのサブグループにします。

Tpfragwall_32
親となるグループ名は自由に付けてください…

この、グループ「AC」を「パーティクルジオメトリ」に適用すると、「パーティクルジオメトリ」の数が1つ減ります。

Tpfragwall_34

この「パーティクルジオメトリ」の「サブグループ」をOnにしてグループ「A」「C」を有効にします。

Tpfragwall_33

では、壁に適用するマテリアルの変異マップです。

「プロクシマル」にパーティクルグループ「B」である「パーティクルジオメトリB」を適用します。

Tpfragwall_35

変位マップのシェーダの組み合わせです。
組み合わせは、他にもありますので試してみてください。

Tpfragwall_15

最後の「カラー変換」で凹みの部分が白いので変異量はマイナス側になります。

Tpfragwall_16

「カラー変換」で凹みが黒ければ、変異量は通常通りプラス側です。

Tpfragwall_18

凹みの色は白/黒、どちらでも問題ありません。

PyroClusterの設定は、「火山」をベースにしました。

Tpfragwall_49

濃度を薄くし、黄色味を取りました。生成最初のフレームを発光させるために「発光」も変更しました。

Tpfragwall_50

最初の2フレーム分発光させるので「発光」を変更。
黄色く発光し、後は白なので「カラー」を変更しました。
「グローバル」のカラーとミックスするので「カラーミックス」を変更。

これで、一通り説明が終わりました。
かなり割愛しましたが…

「TPFragWall_04.ZIP」

では、衝突絡みを処理するXPressoを、それぞれのグループ毎に分割します。

グループ「A」とポリゴンとの衝突判定の結果を受けてグループ「C」「D」のTPジェネレータが作動するのですが…
これを、グループ「A」からグループ「B」へ移籍した時にイベントを受け取る形にします。
グループ「C」「D」の初期の位置は、静止したグループ「B」のパーティクルの位置を「PSetData」で取得します。
残りの必要なデータは、衝突位置での法線ベクトルです。
この法線ベクトルを受け取るにはどうしたらよいのでしょう…?

この問題を解決する方法が、パーティクルのデータチャンネルです。
全てのパーティクルにユーザが独自の値を設定する事ができます。
このチャンネルにベクトル型を追加し、グループ「A」がポリゴンに衝突しグループ「B」に移籍するときに、法線ベクトルをデータチャンネルに格納します。

Tpfragwall_51

後は、グループ「C」「D」はグループ「B」に対し「PAge」ノードの「グループに入る」のイベントを受け取ったときに、パーティクルからデータチャンネルに格納された法線ベクトルも取得する事にします。

では、パーティクルにデータチャンネル「法線ベクトル:正規ベクトル」を追加しましょう。

Tpfragwall_36_2

チャンネルタブをクリックすると…

Tpfragwall_37

データの型を「正規ベクトル」とし、チャンネル名「法線ベクトル」とします。
現在表示されている「固定文字」を「正規ベクトル」へ変更します。

Tpfragwall_38

チャンネル名「法線ベクトル」を入力。

Tpfragwall_39

追加ボタンをクリックするとデータチャンネルの追加が完了します。

Tpfragwall_40

これで、シーン中に生成される全てのパーティクル1粒毎に、正規ベクトル型の法線ベクトルと言う名のデータチャンネルが用意されます。

では、先ほどのXPressoの赤枠部分と緑枠部分を分割します。

Tpfragwall_27

まずは、枠の無い「PPass」のグループ「A」の部分から…

Tpfragwall_41

「PDeflector」ノードの「イベント位置」を削除しました。
これもデータチャンネルにした方が良かったのだろうか…?
今回は「PSetData」でパーティクル位置を取得し適用します。

このパートは、パーティクルグループ「A」の処理でポリゴンに衝突したらグループ「B」へ移籍し、初期速度(XYZ:0.0 , 0.0 , 0.0)を設定します。
では、先ほどのデータチャンネル「法線ベクトル」を追加します。
データチャンネル「法線ベクトル」は「PSetData」ノードの入力ポート一覧にあります。

Tpfragwall_42

「法線ベクトル」を追加し、「PDeflector」ノードの「イベント法線」と連結します。

Tpfragwall_43

これで、エミッタ部の「PStorm」から放出され、ポリゴンに衝突したパーティクルに「法線ベクトル」が設定されます。

では、緑枠のグループ「C」のパートです。

グループ「B」を設定した「PPass」ノードを使いパーティクルを取得します。
「グループに入る」に設定した「PAge」ノードの「オン」を「PBorn」ノードの「オン」と繋ぎます。
「PPass」ノードからのパーティクルから「PGetData」ノードを使い「位置」「法線ベクトル」を取得し、それぞれ「PVelocity」ノードと「PSetData」ノードに繋ぎます。

Tpfragwall_44

これで、グループ「A」の衝突位置と、その法線ベクトルをグループ「C」のパーティクルに渡す事ができました。

では、最後の緑色枠内のグループ「D」です。
全く同じように作業します。

Tpfragwall_45

これで、完成です。

「TPFragWall_05.ZIP」

Tpfragwall_46

最終的なシーンの構成です。

気付かれた方もいると思いますが…
「PDeflector」ノードでの衝突位置がポリゴン面と一致していません。

Tpfragwall_47

横から見た図です。
垂直の白い線がポリゴンの位置です。
緑色のパーティクルの位置(横)がバラバラになっています。

この御陰?で「プロクシマル」での穴の形が不均一になってくれました。怪我の功名だろうか…?

作りが雑なだけなのですが… 良い方に解釈してください…

Tpfragwall_48

今回の記事で、データチャンネルの使い方も理解できたでしょうか?

|

« C4D ThinkingParticles パーティクルの速度ベクトル… | トップページ | C4D ThinkingParticlesでC4D標準パーティクルのようにオブジェクトをランダムに適用する »