« C4D 変位マップ | トップページ | C4D ThinkingParticles エミッタとパーティクルグループ »

C4D ThinkingParticlesで1枚ポリゴンの木を地面に配置する…

う~ん…
やはり、こう言うものは、今じゃMoGraphを使うんだよね、多分…

ま、このブログが誰かの為になっているとは思えないし…
あまり取り上げられないネタなので、このブログには、ちょうど良いネタだろう…

さて…

今回は、地形に1枚ポリゴンの木をC4D ThinkingParticlesで配置します。

主なオブジェクトは、地形となるオブジェクトと木テクスチャ(α付)をマッピングする1枚のZ軸向きポリゴン…
本来であれば、同じ木を配置すると不自然さが出てくるので、数種類の木を用意すべきですが、今回もテストなので1枚のみです。

Tp_57

Tp_58

「TP_Tree_01.ZIP」

α抜きされた木のポリゴンを地形に配置しますが、木のポリゴンを全てカメラの方向に向けなければいけません。
カメラアニメーション等をしたときに、ポリゴンが横向きの状態になってしまうのを防ぐためです。
単純に「カメラに向く」エクスプレッションタグで良いのかは、後ほど…
多分問題が出てくると思われますが、もし、このタグを使うのであれば…
木は垂直に立ちますので「上下の向きも変更」をOffにします。

Tp_59

まずは、C4D ThinkingParticlesの設定から…
適当なオブジェクトにXPressoタグを取り付けます。
ここでは、いつものようにヌルオブジェクトを追加しXPressoを取り付けました。

Tp_60

前回と同じエミッタの「PMatterWaves」を使います。
パーティクルグループはAllの下に、新規で「A」を追加しました。

Tp_62

Tp_61

「TP_Tree_02.ZIP」

あくまでも、個人的な意見ですが…
1種類のパーティクルの場合、グループは「All」1つで良いのですが、なるべくなら「All」は使わないようにして新規でグループを追加したほうが良いと思います。
マニュアルによると、パーティクルを使う場合は、シーン全体で「どのように」「どれくらい」使うのかを最初に考えるようです…
が、プロではないユーザや使い慣れていないユーザだと、作っていくうちに追加する事が考えられます。
もし「All」一つに設定した状態で、新たな別の動きをするパーティクルを追加する事になるとグループを追加しなければいけなくなります。
既に「All」に割り付けたパーティクルの設定を全て付け替えなければならなくなるからです。
ま、付け替え作業は、たいした事ではないですが…

グループの追加は、追加するサブグループの親となるグループを右クリックします。
「All」がマスタールートで、「All」と同位のグループは作成できません。全ては「All」のサブとなります。

Tp_63

では、「PMatterWaves」の設定です。

Tp_64

パーティクルを発生させる地面オブジェクトを指定します。
地面の全面に配置させるので、選択範囲は指定しません。
生成タイプは今回は「ショット」を使います。
「ショット」はフレーム毎に放出する量です。
有効期間は、レンダリングするアニメーションの長さにします。

計画としては、最初の1フレームで500枚のポリゴンを発生させ、残りのフレームは発生させません。

発生させたパーティクルは、飛んでいくわけではないので、「速さ」は0.0です。

Tp_65

大きさは、適当に入力してください。
大きさの範囲を持たせると、配置されたときの不自然さが少し緩和されます。

次に、パーティクルは最初のフレームだけ発生させるので、「PMatterWaves」の入力の「オン」を使って最初のフレームのみ「On」、残りは「Off」を入力します。
時間の比較は、「フレーム」でも「実数(秒)」でもどちらでも問題ないです。
0フレームか、それとも0秒かの違いです。

「比較」ノードを使って比較し、その値を「PMatterWaves」の「オン」に入力します。

Tp_66

時間との比較に定数を使いましたが、上の図のみで説明がつくようにしただけの事なので、属性マネージャに表示されているパラメータ属性の該当項目に直接入力してもかまいません。

これで、最初のフレームだけパーティクルが発生し、後は終了まで同じ位置に止まっています。

Tp_67

「TP_Tree_03.ZIP」

パーティクルは空間上に留まっているだけなので、地面を動かしてもパーティクルは追従しませんが…

では、パーティクルに木ポリゴンを割り当てます。

Tp_70

「パーティクルジオメトリ」オブジェクトを追加し、「パーティクルグループ」に「A」を指定します。

Tp_69

Tp_68

これで、地面に木ポリゴンが配置されます。
アニメーションを再生して確認してください。

Tp_71

「TP_Tree_04.ZIP」

配置されましたが、全てZ軸方向を向いています。

では、木ポリゴンに「カメラに向く」エクスプレッションを取り付けます。

Tp_72

先ほど説明した、「上下の方向も変更」をOffにします。

Tp_73

この値は、プリセットでOnになっているので、取り付けと同時に木ポリゴンの角度「P」が変更されますので0.0に設定しなおしてください。

Tp_74

変更は、座標マネージャでもかまいませいん。

Tp_75

「TP_Tree_05.ZIP」

これで、問題なく思えますが…(実際には完全ではありません)

この状態で、アニメーションさせます。
適当に、キーフレームなりを設定してください。

一見、1枚ポリゴンの様には思えませんが…

では、ちょっとした実験です

Tp_76

エミッタは違いますが、動作はほぼ同じです。
最初のフレームのみ動かないパーティクルを発生させます。

Tp_77

位置方向関係をわかりやすくする為、パーティクルを矢印にしました。

Tp_78

「TP_Tree_Test_01.ZIP」

以後パーティクルとパーティクルに適用するオブジェクトとの関係の話では、勝手ではありますが、パーティクルに適用するオブジェクトを「マスターオブジェクト」と呼ばせていただきます。

パーティクルの全ては、マスターオブジェクトの方向と同じ方向を向いています。
マスターオブジェクトと同じ方向だからと言っても、カメラの方向とは限りません。

カメラのターゲットをマスターオブジェクトにすると、問題が緩和されます。

厳密には、カメラの方向は向いていないものの、カメラの視野にあるパーティクルは、ほぼカメラの方を向く事になります。

Tp_79

「TP_Tree_Test_02.ZIP」

カメラの視野が広角になるとばれてしまいますが…

どうしても、パーティクル1粒1粒を正確にカメラの方向に向けるには…

「PGetData」ノード「PSetData」ノードを使います。

Tp_82

これは、パーティクル1粒1粒のデータの取得と適用をします。

これで、パーティクルの粒子位置とカメラ位置から処理する事ができます。

さて、具体的に考えると…
「パーティクルからカメラまでのベクトルをパーティクルのZの方向に向ける。」
「PSetData」の入力を見ると、方向に関する入力は無いのでマトリクスを使うことになります。
ベクトルからマトリクスへ、Z軸ベースで変換します。
ただしパーティクルY軸は空間に対して垂直です。

パーティクルからカメラへのベクトルをマトリクスへ変換し、そのマトリクスのY軸が垂直になるようにマトリクスを回転…

ところで、マトリクスを回転させるには、どのノードを使うのだ?

こう考えると、XPressoノードで処理するのは難しくなり…
C.O.F.F.E.E.ノードを使うこととなります。

では、違う方法…

パーティクルからカメラへのベクトルのY成分を0.0にしたベクトルをマトリクスに変換する。

これならば、XPressoノードだけで処理する事ができます。
ま、「C.O.F.F.E.E.」ノードもXPressoノードですが…

Tp_80_2

少し長くなりましたが…
こう言う時は、XGroupを積極的に使ったほうが良いですね…

Tp_81

「TP_Tree_Test_03.ZIP」

ここで、注意が必要です。
マスターオブジェクトのマトリクスは、パーティクルのマトリクスとは同一のものではありません。
必ずマスターオブジェクトは、親オブジェクトに対して正対させてください。
※マスターオブジェクトのローカル角度HPBを(0.0 , 0.0 , 0.0)
そうしないと、下の図のように意図した方向を向かず、頭を悩ませる事となります。

Tp_83

これで、カメラ方向に向かせるテストは終わりです。

それでは、木ポリゴンに取り付けた「カメラに向く」エクスプレッションタグを削除します。

Tp_85

角度HPBを全て0.0にします。

XPressoを追加変更します。

Tp_84

これでパーティクルは、完全にカメラの方を向きます。

Tp_86

レンダリングすると…

Tp_87

「TP_Tree_06.ZIP」

先ほどのアニメーションのターゲット位置に、たまたまパーティクルのマスターオブジェクトがあったので…
運が良かったのか、悪かったのか…
違いはさほどありません…

これで、地面オブジェクトに配置の方法は問題ないと思います。

残った問題は木の影です。

上のアニメーションでは、カメラが位置を変える度に、ポリゴンがカメラの方向に向きを変えるので、木の影の形が変わってしまいます。

1枚ポリゴンにテクスチャをマッピングしライティングすると…
ライトの位置によっては影がなくなってしまいます。

Tp_88

Tp_89

この不具合を緩和する方法があります。
ただし、木のように横幅に対して地面との接地部分が少ないものが有効です。
ほとんど木意外は無理がありますが… 道路標識とかも大丈夫です…

影用の木を同じ位置に立て、ライト方向に向けます。

Tp_90
カメラ用ポリゴン

Tp_91
ライト用ポリゴン

影用の木は取り付けた「コンポジット」タグで「カメラから見える」をOff/「影を落とす」をOnにします。
カメラ用の木の「コンポジット」タグは「カメラから見える」はOn/「影を落とす」をOffにします。

同じ形状、同じテクスチャを使うので「インスタンス」オブジェクトを使いたいのですが、「コンポジット」タグなどの関係上「インスタンス」オブジェクトは使えません。

Tp_95

「TP_Tree_Test_04.ZIP」

ポリゴンの軸の位置は、テクスチャの幹の根元にすると、多少の違和感があるものの影のずれがなくなります。

Tp_93

これで、影の不具合が緩和できます。
あくまでも、緩和なので完璧ではありません。

ま、こんな小細工をしないで十字ポリゴンを配置するか…
十字にすると、カメラからの角度が浅くなった方のテクスチャにブラーがかかった様な、違う不具合が起こります。

Tp_94

ある程度モデリングした木を配置するか…
すると、メモリーが食われます。

では、先ほどのパーティクルに影用の木を配置します。

方法は、いくつか考えましたが、どれも最終までたどり着けず…
考えが最後までたどり着いたのは、新たなパーティクルを追加し、先ほどの「カメラ用の木のパーティクルと同じ位置に、新たなパーティクルを配置する」でした。

位置の変更は、先ほども使いました「PGetData」「PSetData」ノードを使います。

パーティクルグループは、影用のグループを新たに追加し「B」とします。

Tp_96

XPressoは、先ほどのものに追加せず、新たなXPressoを使います。

Tp_102

Tp_97

「PPass」ノードのお陰で、XPressoを分割していても、他のパーティクルの情報を取得する事ができます。

エミッタの設定はまったく同じです。
グループが「B」指定になっただけです。

「PPass」ノード以降は…
「A」グループのパーティクルの位置を「PGetData」で取得し「B」グループに「PSetData」で変更しているだけのシンプルな処理です。
本当に同じ位置に配置されるのかテストするために、「球体」オブジェクトを追加し指定しました。
グループ「B」の為の「パーティクルジオメトリ」も追加します。

Tp_103

Tp_98

「TP_Tree_07.ZIP」

問題なく配置されました。

さて、「コンポジット」タグ等は「パーティクルジオメトリ」オブジェクトに付けても意図した通りに反映されるのだろうか…

Tp_104

Tp_99

「パーティクルジオメトリ」に「コンポジット」タグを付け「影を落とす」をOffにしました。
問題なく木の影が消えています。

では、「B」グループ用に追加したXPressoに光源方向に向くような処理を追加します。

カメラ方向に向けた処理はカメラのポジションを使いました。
点光源ならば、この方法で良いのですが、平行光源なのでこの方法をそのまま使えません。

このように書くと、なんだか複雑な処理をしなければいけない様に思えますが…
先ほどと同じ位簡単です。

平行光源のグローバルマトリクスのV3(Z軸ベクトル)を反転し、Y成分を0.0にしたベクトルをZ軸ベースでマトリクスに変換。
このマトリクスをパーティクルの「配置」に適用します。

文章にすると、わかり辛いですか?

先ほどの黄色い球体を削除しグループ「B」の「PSape」ノードに木のポリゴンを指定します。

Tp_101

ライトのマトリクスのV3を「反対の数」ノードで反転していますが、反転しなくても問題はありません…
Z軸がライトの真逆を向くと言うだけの事です。
「反対の数」ノード以降は、カメラ方向を向かせた時と同じです。

グループ「B」の「パーティクルジオメトリ」に「コンポジット」タグを取り付け、「カメラから見える」Off、「影を落とす」Onにします。

Tp_105

「TP_Tree_08.ZIP」

レンダリングすると…

Tp_100

光線は、ほぼ右方向の真横から当たり影は左に伸びていますが、薄っぺらになっていません。
問題ないようです。

木をα抜きしているので、このアニメーションに被写界深度やベクターモーションブラー/オブジェクトモーションブラーを使うと意図しない結果になります。

|

« C4D 変位マップ | トップページ | C4D ThinkingParticles エミッタとパーティクルグループ »