Niagaraの応用練習(2) 木のような表現 (再帰的処理)

Niagaraの応用練習(2)

UE4確認バージョン  4.20.1

※なおこの段階ではNiagaraはアーリーアクセスなので

※今後内容がかわるかもしれないのでご注意ください

木のような表現 

f:id:CrabPunch:20180804082350p:plain

 

 

 

今回は再帰的処理の応用のお話です。

GDCでのNiagaraでの説明があったときの画像ですが

f:id:CrabPunch:20180804083051p:plain

Programmable VFX with Unreal Engine's Niagara | GDC 2018 | Unreal Engine - YouTube (35:55あたり)

 

こちらのようなものの作り方を考えていきたいとおもます。

あくまでサンプルが公開されているわけではないので、

似たようなものを作る場合どうしたらいいかといったお話なので、

上記のものと同じ作り方であるかどうかは別です。

 

 

作り方(概要)

・木の作成の方法として、構成を「幹」「枝」「葉」の3つ考える

・まず「幹」となる中心となるものを1つスポーンさせる。

・次に「幹」から一定時間たったときイベントとして「枝」をスポーンさせる。

・同じく、次に「枝」から一定時間たったときイベントとして「葉」をスポーンさせる。

 ・「幹」「枝」「葉」の動きをトレースしたラインなりリボンなどのパーティクルをスポーンさせる。

・最終的にSystemが1つ「幹」「枝」「葉」のスポーンEmitter3つ、

「幹」「枝」「葉」のトレースEmitter3つの合計Emitterが6個という構成です。

 

以上おしまい。

 

※「幹」「枝」「葉」ともどもすべて同じうごきのEmitterということになります。

同じ処理を親から子、子から孫へと繰り返す再帰処理的な考えで作れます。

プログラムなどであれば自分の関数内から自分を呼ぶなどして

同じ処理を連続して行うことが可能なのですが。

NiagaraのEmitter部分でこれをやろうとした場合スタック型なので

同じEmitterを3つ作って重ねるという、コピペコードのような

ことをすることになりました、、、(他に方法がるのかもしれませんが)

 

 

 

作り方(詳細)

 手順1 幹となるパーティクルのEmitterの作成

 

好きなベクトルなどで結構なので、1パーティクルだけ

生成して上方向に伸びるなり、ノイズでゆらぐなりして動く

Emitterを生成します。

  

 手順2 幹、枝、葉用としてSystemに3Emitterを用意する

幹から数秒おきにEventを発行し、

枝をスポーンさせ、

枝から数秒お気にEventを発行し、

葉をスポーンさせます。

解像度の都合分かりにくいかもしれませんが、

幹(赤)

枝(青)

葉(緑)

とスポーンできるようになると以下のようになります。

 

 手順3 位置通知のEventModuleを自作する

今回1つのEmitterからEvent発行が2つ必要になります。

1つは一定タイミングで子をスポーンさせるためのEvent

もう1つは定期的に現在座標を通知して、ラインを描画してもらうためのEvent

 

発行Eventが2つになると受け取るほうの問題として

どちらのEventを受け取るかの判断が必要になります。

NiagaraのEventは名前で管理されているので

1つのEmitterからEvent発行するときはEvent名を変えてあげないと

他からそれぞれが認識できません(もしかしたら他にスマートな方法があるのかもしれない)

 

f:id:CrabPunch:20180804090839p:plain

 

f:id:CrabPunch:20180804090857p:plain

こうするとEventの受け手側で2つEventが見れて選ぶことができます。

 

 手順4 各スポーンから生まれたものに対して追従のパーティクルを作る

上記のEventで生成した毎フレーム位置の受信をするものにあわせて

ラインを生成します。

一旦、わかりやすく。

幹(赤)

枝(青)

葉(緑)

とします。

結果は以下のとおり。

f:id:CrabPunch:20180804091106p:plain

 

 

 

手順5 最後に整える

最後はスポーン元のパーティクルの表示を消し。

ライン用パーティクルのマテリアルやらパラメーターを

好みに調整します。

 

※人によってはパーティクルをConeのようなMeshにして

それから入門でお題にだしたNormal方向に子を生成すると

いったやり方なども面白いかと思います。

 

 

f:id:CrabPunch:20180804091511p:plain

 

Systemの構成としては以下のようになります。

f:id:CrabPunch:20180804091414p:plain