« C4D XPresso[ランダム]ノードが出力する実数値 | トップページ | C4D 少しガッカリさせられた「ランダム」ノード… »

C4D ThinkingParticles 簡単なスプラインエミッタを作ってみる。

この記事を作るにあたって、公開前に数度の書き直しが…
理由は、XPressoの「ランダム」ノードの出力結果です。
手持ちのC4D R9.5/R10.5Demo/R11.0Demo/R11.5Demoとの出力結果が、意図しない状態になってしまいます。

記事自体は、たいした物ではありません…
出力結果が一致しない事に気付いてしまったので…
記事を削除使用とも思ったのですが… そのまま公開します。…

シーンファイルはR9.5ですが、作業の内容はR11.5Demoです。
R11.5Demo以外のバージョンでは結果が意図しない状態です。
C4D ThinkingParticlesを搭載しているユーザは確認してみてください。

では…

C4D ThinkingParticlesでパーティクルを放出するには…
C4D標準パーティクルエミッタのような、「PStorm」…
ポリゴンオブジェクトの表面から放出できる「PMatterWaves」…
パーティクルオブジェクトを粉砕して新たなパーティクルを生成する「PFragment」… これは放出とは言えませんが…
これらのジェネレータは、パラメータ設定だけで放出が可能です。

この他に、全く違う形体の放出が必要になったときに「PBorn」を使います。

「PBorn」には、余分なパラメータがなく、単にパーティクルを生成するだけのノードです。
「PSetData」ノードを使って値を設定していきます。
ま、他のジェネレータでも、「PSetData」ノードを使えば多種多様な放出が可能ですが…

それでは、簡単なスプラインエミッタを作ってみよう。

まずは、エミッタの元となるXPresso付きのヌルオブジェクトを用意します。
名前を「スプラインエミッタ」に変更しました。

Splineemi_01

適当なスプラインを用意します。

Splineemi_02

Splineemi_03

このスプラインから、パーティクルを放出させます。

設定値を入力できるように、ヌルオブジェクト「スプラインエミッタ」にユーザデータを追加しますが、今回は簡単なスプラインエミッタなので、入力できるパラメータも少なめにします。

  • 放出用のスプライン…[リンク]
  • On/Off…[ブール]
  • 生成タイプ…[整数]
  • パーティクル数…[浮動小数点]
  • 有効期間…[時間]
  • 放出速さ…[浮動小数点]
  • パーティクルの大きさ…[浮動小数点]
  • パーティクルグループ…[リンク]

方向はスプライン上の位置から放射状に…

Splineemi_04

まずは、ヌルオブジェクト「スプラインエミッタ」にユーザデータを追加します。

Splineemi_05

順番は重要ではありません。
では、このユーザデータに常識的な範囲の適当な数値を入力してください。

Splineemi_06

パーティクルグループは、このように設定しました。

Splineemi_37

では、C4D ThinkingParticlesを組んでみましょう。

「PBorn」ノードと、ヌルオブジェクト「スプラインエミッタ」を追加します。
「PBorn」の入力ポートに「オン」「有効期間」「生成タイプ」「カウント」「レート」「ショット」を追加し、ヌルオブジェクト「スプラインエミッタ」のユーザデータと対応するポートを繋ぎます。

Splineemi_07

「PBorn」ノードの出力に「生成番号」を追加します。

ヌルオブジェクト「スプラインエミッタ」のタイトルバーに色を設定しました。

Splineemi_24

続いて「スプライン」ノードを使って、スプライン上の位置をパーティクルに与えます。

「スプライン」ノードを追加し、入力の「オブジェクト」にヌルオブジェクト「スプラインエミッタ」に追加したユーザデータの「スプライン」を繋ぎます。

Splineemi_08

「スプライン」の属性は、「グローバル」「均一補間」「全てのセグメント」です。

Splineemi_09

「スプライン」の入力「位置」に0.0~1.0までのランダムな数値を入力し、出力からスプラインに対応した3次元座標を取得します。

「PSetData」を追加し、入力に「位置」「速度」「大きさ」を追加し、「PSetData」の入力「位置」と、「スプライン」の出力「位置」を繋ぎます。

Splineemi_10

「PSetData」の入力「パーティクル」と先に追加した「PBorn」の出力「パーティクル生成」を繋ぎます。

Splineemi_11

この状態で再生すると、スプラインの最初の位置0.0に全てのパーティクルが出現します。
パーティクルは色が白なので、まだ設定されていなく「All」という事です。

Splineemi_12

では、ランダム値(0.0~1.0)を使って、スプライン全体に配置させましょう。

まずは、「PBorn」ノードの出力に「生成番号」を追加し、「ランダム」ノードも追加します。
「ランダム」ノードの出力には、「実数」を追加します。

Splineemi_14

「ランダム」ノードの属性は、「時間」「絶対値」です。
絶対値を有効にしなければ、この「ランダム」ノードは-1.0~1.0を出力します。
「時間」ではなく「フリー」を選択したならば、完全なランダム値になり、レンダリングするたびに結果が変わってしまいます。
もしレンダリング途中で何らかの理由で中断し、後でレンダリングを再開したときにはアニメーションが繋がらなくなります。

Splineemi_15

では「PBorn」の「生成番号」と「ランダム」ノードの「ランダムシード」を繋ぎます。
続いて、「ランダム」ノードの出力「実数」と「スプライン」ノードの入力「位置」を繋ぎます。

Splineemi_34

「ランダム」ノードが出力する数値は、出力の全体から見るとランダム値を出力しますが、「ランダムシード」に同じ値を入力すると、同じ値を出力して今います。
ですから、パーティクルが放出される時に1粒づつ変化する生成番号をランダムシードに使います。

これで、アニメーションを再生すると、スプライン全体に配置されます。

Splineemi_16

が、エリア毎にまとまって増えているようです。

この対処は後ほど…

この配置された位置から放射状に放出させます。
この放出もランダム値(ベクトル)を使います。

ここで、「放射状のランダム正規化ベクトル」を出力するXGroupを作ります。

Splineemi_35

このXGroupの内容は…
ランダムベクトル(X:-1.0~1.0 / Y:-1.0~1.0 / Z:-1.0~1.0)を取得。
ランダムベクトルの長さを1.0へ変換。
任意の長さにベクトルを調整。
という手順です。

XGroupの出力に「ランダムシード:整数」「長さ:実数」を追加します。
出力には「ベクトル」です。

XGroupの中には、「ランダム」「万能:正規ベクトル」「計算:乗算」を配置し連結しました。

Splineemi_18

「ランダム」ノードは「時間」「絶対値:Off」です。

「計算」ノードは、ベクトルの乗算です。

Splineemi_19

これで、このXGroupにランダムシードと長さを入力すると、任意の長さで放射状のベクトルを取得できます。

ヌルオブジェクト「スプラインエミッタ」のユーザデータ「速さ」を、このXGroupの「長さ」に繋ぎます。
出力の「ベクトル」を「PSetData」の「速度」へ繋ぎます。
入力の「ランダムシード」は、「PBorn」の「生成番号」へ繋ぎます。

Splineemi_17

これでアニメーションを再生すると、スプラインからパーティクルが放出されます。

Splineemi_21

妙な具合です…

妙な具合ですが、最後まで作業を進めます。

「大きさ」と「パーティクルグループ」が残っています。
ヌルオブジェクト「パーティクルエミッタ」のユーザデータ「大きさ」を「PSetData」の入力「大きさ」に入力します。

Splineemi_22

「PGroup」ノードを追加し、入力の「PGroup」とヌルオブジェクト「スプラインエミッタ」の「パーティクルグループ」を繋ぎます。
「PGroup」の「パーティクル」と「PBorn」の「パーティクル生成」を繋ぎます。

Splineemi_36

再生してみます。

Splineemi_38

パーティクルが赤になったのでグループ「A」に設定されたようです。

これで、一通り完成したと思います。

スプライン上の位置を取得する不具合や放出の不具合は、「ランダム」ノードが影響を与えています。
「ランダム」ノードの出力する値は前回取り上げましたので、そちらを参考にしてください。
http://villager-and-c4d.cocolog-nifty.com/blog/2009/11/c4d-xpresso-f8e.html

では、ここからは放出の不具合を修正していきます。

前回の記事で、「ランダム」ノードの「ランダムシード」に近い数字を使うと同じような数値の配列になるという事がわかりました。
対処法は、ランダムシードに入力する連番数値をn倍にし間隔を開けるか、「ランダム」ノードを多重にするという事でしたが…

実は、生成されたパーティクル1粒づつに、TPジェネレータで整数のランダム値が与えられています。

では、確認してみましょう。
簡単なパーティクルランダムシードテストです。

Splineemi_20

「PBorn」ノードで生成されたパーティクルから「PGetData」ノードを使って生成されたパーティクル全ての「ランダムシード」値を「C.O.F.F.E.E.」ノードでコンソールに表示します。

Splineemi_13

main()
{
  println(rndseed);
}

アニメーションを再生してください。
コンソールに生成されたパーティクルの「ランダムシード」値がランダムな値で表示されます。

---- 0 ----
69069
475628534
1129920459
772999772
1730348409
---- 1 ----
1674351794
1662200407
2044158072
1641506277
797919022
---- 2 ----
596140963
1156259412
1059494673
584849258
786050991
---- 3 ----
1221861360
929943805
1200308582
507288187
1692139852

「SplineEmi_01.ZIP」

このパーティクルのランダム整数「ランダムシード」を「ランダム」ノードの「ランダムシード」へ入力します。

では、スプラインエミッタへ戻ります。

「PBorn」ノードの「生成番号」と「スプライン」ノードの「位置」との間にある「ランダム」ノードの前に「PGetData」を指し込み、「PGetData」の出力に「ランダムシード」を追加し連結します。

Splineemi_23

「PGetData」の入力「パーティクル」は、「PBorn」の「生成番号」ではなく、「パーティクル生成」へ連結してください。

これで、アニメーションを再生します。

Splineemi_25

問題ないように見えます。

Splineemi_26

スプラインを正面から見てもスプラインから均等に放出されているように見えます。

多分、気づいているユーザもいると思いますが…
放射状のランダムベクトルも、「PGetData」から取得した「ランダムシード」を使った方が良いのではないだろうか…と。

Splineemi_26_2

さて、結果は…

Splineemi_27

特定な方向性を感じます。

これも、「ランダム」ノードの特性なのか、不具合なのか、わかりませんが、シードを元に生成された、「整数」「実数」「ベクトル」は、何らかの関連があるのかもしれません。
例えば、シードがまったく違っても、生成された実数が0.4だった場合、ベクトルも何らかの似た数値が返ってくるのではないでしょうか…

これもいつか確かめようと思います。

という事で、放射ベクトルは、「PBorn」の「生成番号」と連結という事にします。

これで、完成です。

「SplineEmi_02.ZIP」

ただし、C4D R11.5Demoに関係するバージョンに限定です。
C4D R11.5だと問題ないと思いますが…

では、ここでこのファイルを手持ちのR9.5/R10.5Demo/R11.0Demo/R11.5Demoを比べてみます。
同じファイルで、このような結果の差が出てしまいます。

R9.5
Splineemi_28
1点から放出されています。

R10.5Demo
Splineemi_29

R11.0Demo
Splineemi_29_2

R11.5Demo
Splineemi_25

R10.5DemoとR11.0Demoが同じような結果になりました。

もしかすると「ランダム」ノードは、R11.0まで、不具合の状態だったのだろうか…?
それとも、自分のPCがオカシイのか…?
使い方を間違っているのか…?

判断できません。

ですからR11.5以外で、このファイルのパーティクルの動作がオカシイ人は諦めてください…

スプラインエミッタが必要なユーザは、コンテンツブラウザ内のThinkingParticlesに「TP Spline Emitter」がありますので、そちらを利用してください。
こちらは放出ではなく、スプライン上に生成するだけのようですが…。
これを改良して「PSetData」で放出する方向を与えれば、放出系のエミッタになるでしょう。

|

« C4D XPresso[ランダム]ノードが出力する実数値 | トップページ | C4D 少しガッカリさせられた「ランダム」ノード… »