« C4D マテリアルの特殊効果の波紋シェーダを使ってみた… | トップページ | C4D 変位マップ »

C4D 久々にThinking Particlesを使ってみた…

最近、MoDynamicsのお陰で、MoGraphにスポットライトが当たって、C4Dユーザの注目を集めていますが…
ThinkingParticlesは、どうなんだろう…
ま、ノードを繋げて使わないといけないので、お手軽ではないですけどね…
その、お手軽ではない事が、あまりC4Dユーザの気を引けないのだろう…

最近まで自分は、XPressoタグの中で使われるものが、XPressoだと…
要するに「ThinkingParticles」や「Hair」「モーショングラフィックス」全てを総称したものがXPressoと呼べると思っていました…

ヘルプを読んでいると、XPressoと呼べるのは、「衝突判定」や「C.O.F.F.E.E.」「繰り返し」などで…

では「ThinkingParticles」は、何て呼べば良いのだろう…
ま、そのままThinkingParticlesのノードと呼べば良いのだろうね…
でも、ThinkingParticlesを組み込んだXPressoタグをweb公開する場合は…?
「ThinkingParticlesのXPresso」とは、呼んではいけないのだろうか…?

こんな事は誰にも聞けないし…
多分「好きにすれば…」って言われるだろうし…

さて、グダグダは又の機会に…では、本題を…

物体が、地面と衝突し土煙を上げて静止する… こんな具合のアニメーションで…

土煙は、ThinkingParticles + PyroCluster
XPressoの衝突判定ノードを使い、衝突したポリゴンからThinkingParticlesのPMatterWavesを使ってパーティクルを放出してみます。

注)画面キャプチャはR11.5Demoですが、アニメーションのレンダリングはR9.5です。
R9.5のレンダリングは、R11.5 Demoに比べると、やはり遅いですね…
バージョンアップすると恩恵を受けられるんでしょうが…

ThinkingParticlesは、少し納得のいかない部分があり、積極的に使っていませんでした。
使うときはいつも、なんとなく使っている状態で…

では先ほどの、アニメーションにThinkingParticlesを適用します。
基本的な手順は以下の通りです。

XPressoの衝突判定ノードは、このブログでも以前紹介したような…

「TP_test_B01.ZIP」

Tp_12

衝突を判定する2つのポリゴンオブジェクトを入力

Tp_13

衝突タイプを「オブジェクト」に変更し…

衝突判定ノードに入力したオブジェクト1 , 2のポリゴン選択範囲タグを設定すると、衝突したポリゴンがポリゴン選択範囲に記録されます。
入力したオブジェクト1 , 2と選択範囲タグ1 , 2を取り違えないように…

この選択範囲は両方とも設定しなければならないわけではありません。
選択範囲1だけでも、2だけでも動作します。

衝突タイプを「オブジェクト」にしましたが…
単純な衝突判定で、衝突するオブジェクトが、球体や立方体などの単なる塊ならば、他のタイプでも問題ないでしょう…
形状が入り組んだ複雑なオブジェクトで、衝突しているポリゴンを取得したいならば選択範囲を使うと良いと思います。

Tp_10

衝突ポリゴンが分かるように、テクスチャタグに選択範囲を設定しました。

Tp_11

この地面ポリゴンから、パーティクルを噴出させれば完了です。

「TP_test_B02.ZIP」

ポリゴンの選択範囲からパーティクルを放出させるエミッタは「PMatterWaves」です。
ノードの名前も、日本語ローカライズして欲しいなぁ…
属性の項目は日本語だけど…
日本語ローカライズしていないのは、ThinkingParticlesだけだよね…
でも気の利いた日本語名にするには、難しいかもね…

この「PMatterWaves」を使うには注意が必要です。
ポリゴンオブジェクトからパーティクルを放出させるには、ポリゴンオブジェクトにUVWタグが取り付けていなければ、いくら設定をしても放出されません。

Tp_14

この「PMatterWaves」の属性マネージャの表示は…

Tp_15

縦に長いんだよね…
上に行ったり…下に行ったり…
こう言うので、試行錯誤しながら設定するとストレスを感じるんですよね…

さて、この状態で既にパーティクルは放出されます。

Tp_16

が、レンダリングしても何も現れませんけどね…

ThinkingParticlesから放出されるパーティクルは、グループ毎に処理します。
グループは作らなくても、初めから「All」と言うグループが既に存在します。

ThinkingParticlesから放出されるパーティクルは、必ずグループを設定しなければいけないらしく…

グループが「All」一つしかなくても、必ず「All」に設定します。
パーティクルのグループの設定は、「PGroup」ノードです。

Tp_17

「PGroup」ノードの出力はありません…

「TP_test_B03.ZIP」

この後のグループ毎の処理は、「P Pass」ノードを使います。

Tp_18

「P Pass」ノードから、グループ設定済みのパーティクルが渡されます。
このグループ設定済みのパーティクルを様々なノードを使って処理をします。
上の様に、重力とか衝突反射とか…
※これは、イメージなので上の様にノードを配置された方は、「PPass」ノードを残して削除してください。

この噴出したパーティクルを実体化するためには、パーティクルにオブジェクトを適用します。
このパーティクルにオブジェクトを適用するためには、「PShape」ノードを使います。

Tp_19

新規で追加した「球体」プリミティブを適用しました。

これでも、まだ球体はパーティクルとして噴出されません。
更に、「パーティクルジオメトリ」オブジェクトを追加します。

Tp_23

パーティクルとして噴出させる「球体」オブジェクトの表示は「非表示」にしてください。

「パーティクルジオメトリ」のオブジェクト属性のパーティクルグループに何も設定されていなくても…

Tp_21

下の様にオブジェクトをパーティクルとして噴出しますが…

Tp_20

一応、ThinkingParticles設定より「All」を設定してください。

Tp_22

これで、一通りの設定は完成です。

「TP_test_B04.ZIP」

それでは、実際のシーンで作業します。

「TP_test_01.ZIP」

立方体とカメラにキーフレームが設定されています。
立方体の動きは単純で…
直線的な動きにしましたが、本来なら地面の形状に合わせた動きにするのと良いでしょうが…

まずは、衝突判定です。

Tp_24

ヌルオブジェクトを追加し、名前を「衝突判定 XPresso」としました。
更にXPressoタグを取り付けます。

Tp_25

衝突判定の設定は…

Tp_26

「地形」だけに選択範囲を設定しました。

既に、選択範囲を指定したテクスチャタグを取り付けていますので、ビューにはこのように…

Tp_27

この「地形」の選択範囲からパーティクルを放出させます。

「TP_test_02.ZIP」

パーティクルを設定する為のヌルオブジェクトを追加し、名前を「TP XPresso」としました。
更にXPressoタグを取り付けます。
衝突判定のXPressoと一緒にしても良いのですけどね…
今回は別にしました。

Tp_28

先ほどと同じように、ポリゴン選択範囲からパーティクルを放出させる「PMatterWaves」ノードと、グループを設定する「PGroup」を追加し連結します。

Tp_29

「PMatterWaves」ノードに「地形」と選択範囲を設定します。

Tp_31

生成のカウントを200に変更しました。

この状態でアニメーションを再生すると、選択範囲からパーティクルが放出されます。

Tp_30

「TP_test_03.ZIP」

今回は、このパーティクルに重力を設定してみましょう。
重力方向を示すためにヌルオブジェクトを追加します。
Tp_32

この、ヌルオブジェクトのZ軸方向が重力方向になります。
ですから、角度P:-90に設定します。
設定は座標属性でも、座標マネージャでも、どちらでもかまいません。

Tp_36

先ほどの、「TP XPresso」に「PPass」ノードと「PGravity」ノードを追加します。
「PGravity」ノードに追加したヌルオブジェクト「重力」を設定します。

Tp_33

「PGravity」ノードにヌルオブジェクト「重力」をドロップしても良いし…
「PGravity」ノードのパラメータ属性にドロップしてもかまいません…

Tp_34

重力のタイプは「平面」で…

アニメーションを再生すると、こんな具合です。

Tp_35

再生すると多少の不具合が生じてますが、気にしないで進めます。

「TP_test_04.ZIP」

このパーティクルの放出する「速さ」があまりないので、直ぐに下に落ちていきます。
放出する「速さ」は、オブジェクトの速度に対応させましょう。
要するに、「PMatterWaves」の「速さ」にオブジェクトの速度を入力します。

では、「TP XPresso」に立方体を追加し、「位置の速度」を出力ポートに追加します。
「位置の速度」はベクトルなので、「距離」ノードでベクトルの長さを取得します。

Tp_37

「距離」ノードへの入力は1 , 2どちらでもかまいません。
この値をそのまま「PMatterWaves」の「速さ」に入力しても良いのですが、たぶん調整が必要になります。
今回は「定数」ノードと「計算:乗算」ノードを使ってスケーリングした値を「PMatterWaves」の「速さ」に入力します。
ユーザデータでスライダーボックスを使っての入力が、望ましいと思います。

Tp_38

定数の値は、適当な数値を入力してください。
今回は0.33を入力しました。

この状態で再生すると、先ほどよりパーティクルが地面より上に放出されています。
が、オブジェクトが止まっても、放出され続けます。

Tp_39

「TP_test_05.ZIP」

「PMatterWaves」ノードのパーティクルの放出を止める方法が2通りあります。
「PMatterWaves」ノードの「オン」入力をoffにするか、もしくは「カウント」入力を0にするか…

では、簡単な方で「オン」入力を操作する事にします。
先ほどの「オブジェクトの速度」を利用しましょう。
速度が0だとoff、それ以外がonです。

なんだか、ブール演算なのかブール判定なのか、考えてしまいますが…
先ほどの「PMatterWaves」ノードの「速さ」に入力した値を、そのまま「オン」に入力します。

Tp_40

「オン」はブール値なので、0/1以外の数値は1として扱われます。
これで、オブジェクトが停止すると、パーティクルの放出が止まります。

Tp_41

「TP_test_06.ZIP」

さて、先ほどから画面奥のほうの、他の不具合が気になりますが…

Tp_42

衝突前からパーティクルが放出されています。
どうやら、「PMatterWaves」ノードは選択範囲からパーティクルを放出しますが…
選択範囲がなくなると、ポリゴン0番から放出するようで…
これを制御する為の設定は「PMatterWaves」ノードでは見つかりませんでした。
見落としているかもしれません…

こうなると、衝突判定を使うしかありません…
この段階で、「衝突判定 XPresso」と「TP XPresso」を分けない方が良かったと言う事になります。

では、「衝突判定 XPresso」と「TP XPresso」をまとめてしまいます。
コピー&ペーストしてください。
コピーしたほうは削除してください。
ここでは、「衝突判定 XPresso」をコピーし「TP XPresso」へペーストしましたので…
「TP XPresso」を残して、「衝突判定 XPresso」を削除しました。

Tp_43

先ほどの「PMatterWaves」ノードの「オン」入力の連結は削除してください。
ノードの並びも少し変更しました。

次の作業は、「衝突判定」ノードの出力「衝突判定」のブルー値と「距離」ノードの出力を「ブール演算:AND」で処理し「PMatterWaves」ノードの「オン」に入力します。

Tp_44

Tp_45

パーティクルの放出は、「オブジェクトが衝突し動いている間」のみになります。

これで、選択範囲が無い状態でのパーティクルの放出がなくなります。

Tp_46

「TP_test_07.ZIP」

ではここで、仮にパーティクルに球体を適用してみます。
ま、必要のない作業ではありますが…

「パーティクルジオメトリ」オブジェクトと「球体」プリミティブを追加します。
大きさはそのままの、半径:100です。
「球体」の表示は「非表示」にします。

Tp_47

「TP XPresso」の「PMatterWaves」ノードの大きさを「10」に…

Tp_50

それでは、「PShape」ノードを追加し「球体」を設定します。
先ほどの「重力」ノードに連結した「P Pass」ノードと連結します。

Tp_48

「パーティクルジオメトリ」のオブジェクト属性のパーティクルグループは、「ThinkingParticles設定」より「All」に設定してください。

Tp_49

「TP_test_08.ZIP」

これで、レンダリングすると…

ま、こんなものですね…

では、次に進みます。
パーティクルに適用した「球体」を削除し…
「パーティクルジオメトリ」はそのままです。

Tp_51

「TP XPresso」に追加した「PShape」ノードを削除します。

Tp_52

では、いよいよPyroClusterをシーンに追加します。
今回は、細かくは設定しません。
PyroClusterの設定の「火山」をそのまま使います。

Tp_53

PyroCluster - ボリュームトレーサを追加し、レンダリングモードを「薄い」に変更します。

Tp_54

では、「PyroCluster」を「パーティクルジオメトリ」に適用します。
「PyroCluster - ボリュームトレーサ」は、「環境」オブジェクトを追加し、その「環境」オブジェクトに適用します。

Tp_55

さて試しに1フレームをレンダリングしてみよう…

Tp_56

問題はなさそうなので全てのフレームをレンダリングします。

まぁ、いまいちだね…

「TP_test_09.ZIP」

勢いで、こんな物を作り…
同じように、衝突ポリゴンからパーティクルを放出させ「PyroCluster」を適用…

何の考えもなしに作ったので…
お粗末な結果となりました…

「TP_test_10.ZIP」

海の波は、ノイズを使った変位なんですが…
どうすると、それらしく見えるんだろうね…
これでは…

|

« C4D マテリアルの特殊効果の波紋シェーダを使ってみた… | トップページ | C4D 変位マップ »