« C4D ThinkingParticles ポリゴンオブジェクト内にパーティクルを配置する-02 | トップページ | C4D ThinkingParticles もう仕組みは理解できたでしょうか… »

C4D ThinkingParticles ポリゴンオブジェクトの表面にパーティクルを…

さて、ThinkingParticlesのパーティクルをポリゴンオブジェクトの表面に配置するには…
ポリゴンオブジェクトの表面からパーティクルを放出するTPジェネレータ「PMatterWaves」ノードを使って表面からスピード0.0で放出…
スピード0.0だと放出とは言えないですけどね…

果たして…

Psurfaceposition_01

こんなものを作ってみた。
いつも通りマテリアルは適当なのだ…
ライティングもね…

シーンの構成は下のように…

Psurfaceposition_02

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

Psurfaceposition_03

今回の「パーティクルジオメトリ」は、パーティクルグループ「A」「B」それぞれ1つづつに対応しています。
グループ「A」はチョコの部分で、パーティクルジオメトリAでグループ「A」を指定し、メタボールを適用しています。
グループ「B」は砂糖で… 普通クラッシュアーモンドだろうか…? パーティクルジオメトリBでグループ「B」を指定しています。

メタボールを使わなければ、通常通りパーティクルジオメトリは1つだけで「All」を指定しサブグループ「On」にします。
今回は、グループ「A」「B」のサブグループはないので、サブグループのフラグは「On/Off」どちらでもかまいません。

他のオブジェクトはオブジェクトマネージャの見ての通りです。
「トーラス」がドーナツで、「ポリゴン」が下に引いてあるものです。
「トラース」の選択範囲は、単純に上側の面です。

Psurfaceposition_04

では、ヌルオブジェクト「XPressoA」のXPressoです。

Psurfaceposition_05

これだけです。

今回のパーティクルの生成は1Fにしました。特別な意味はありません。
「PShape」ノードで球体、「PGroup」ノードでパーティクルグループ「A」を設定しています。

「PMatterWaves」ノードの設定です。

Psurfaceposition_06

パーティクルを表面から放出させるオブジェクト「トーラス」を指定し、選択範囲も指定します。
1Fで全てのパーティクルを放出させるので、時間の放出タイプ「ショット」、1000粒です。
サーフェス上の放出タイプを「テクスチャ」を使いました。「ノイズ」シェーダを使って放出位置をまだらにします。
有効期間はアニメーションの全ての時間。
パーティクルをオブジェクト表面に留まらせるので、速さは、0.0。
パーティクルの大きさは、対象となるドーナツの大きさにもよりますので、重要ではありません。適当に調節します。

ヌルオブジェクト「XPressoB」のXPressoです。

Psurfaceposition_07

グループ「A」のパーティクルと、ほぼ同じです。
1Fで生成し「立方体」、グループ「B」を設定します。
立方体の方向をランダムにするために、生成番号をランダムシードとしてランダムな正規化ベクトルを取得します。このベクトルからマトリクスを算出して「PSetData」で配置に設定します。

Psurfaceposition_08

「PMatterWaves」ノードの設定です。

Psurfaceposition_09

パーティクルグループ「A」と、ほとんど変わりはありません。
違う部分は、「距離」です。
ポリゴンの位置から法線方向に10.0離れた所に生成します。
これは、チョコに埋もれない為にポリゴンから離してあります。

これで、完成ですが…

「PSurfacePosition_01.ZIP」

これには、問題があります。
ただし、静止画なら問題ありません。

Psurfaceposition_10

アニメーション中にドーナツを動かしてもパーティクルは追従しません。

この問題も、「PVolumePosition」ノードの記事と同様、TPジェネレータ生成時のみにパーティクルの位置を与えているだけだからですね。

ここからが今回の記事の本題です。

C4D ThinkingParticlesには「PVolumePosition」同様、アニメーション中にオブジェクトの表面に関する位置を取得するノードがあります。
「PSurfacePosition」ノードが、それを実行します。
このノードは、パーティクルの数だけポリゴンの面、エッジ、ポイント上のランダムな座標を出力します。

このノードを「PPass」以降で使用しアニメーション中、常に座標を取得します。

では、「PSurfacePosition」ノードを使うタイプに変更します。
「PSurfacePosition」ノードで常にパーティクルの位置を取得するので、TPジェネレータは「PBorn」ノードを使います。

パーティクルグループ「A」の生成部分です。
ほとんど構成は同じです。

Psurfaceposition_11

Psurfaceposition_12

「PBorn」ノードの設定です。
問題ありませんね。

パーティクルグループ「B」の生成部分です。

Psurfaceposition_13

「PBorn」ノードに置き換えただけで、全く変わりありません。

Psurfaceposition_14

「PBorn」ノードの設定です。

では先に、「PSurfacePosition」ノードの属性を見てみましょう。

Psurfaceposition_15

これだけなのだ…
「PSurfacePosition」ノードには、「ノイズ」シェーダ等でパーティクルの位置をまだらにする事ができません。

仕方がないので、その処理は無視し進めます。

グループ「A」に常に掛ける処理、「PPass」以降の部分です。

Psurfaceposition_16

「PBorn」ノードで与えられないデータを「PSetData」ノードで与えます。
大きさは、生成時(「PBorn」ノード直後)に与えたほうが良いかもしれません。

グループ「B」の「PPass」以降ですが、「PSurfacePosition」ノードでは、対照位置からの距離を指定できません。
ですから、元のトーラスを複製しポリゴンを法線方向に移動させた新たなオブジェクト「トーラスB」を使いました。

Psurfaceposition_21
外側が「トーラスB」、内側が「トーラスA」

Psurfaceposition_17

グループ「B」は生成時、すでに大きさを設定してありますので、ここでは設定しません。

Psurfaceposition_18

こんな具合になりました。

Psurfaceposition_20

最初と若干変わりました。

「PSurfacePosition_02.ZIP」

Psurfaceposition_19

アニメーション中にドーナツを移動させても、問題なくパーティクルは追従します。

|

« C4D ThinkingParticles ポリゴンオブジェクト内にパーティクルを配置する-02 | トップページ | C4D ThinkingParticles もう仕組みは理解できたでしょうか… »