Niagaraの入門(14) Niagara Parameter Collection (NPC) BPとの連携

Niagaraの入門(14)

UE4確認バージョン  4.20.1

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

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

NiagaraParameterCollectionについて

 以前お話したParametersのところにあるNiagaraParameterCollectionですが、

(略 NPC  らしい、、誤解うみそう、、)

Emitter上から追加しようとするとすでにいくつか候補がでるだけで新規で追加ができません。

f:id:CrabPunch:20180814065511p:plain

 

 

追加方法としては

コンテンツブラウザのアセット作成からNiagaraParameterCollectionを選び

f:id:CrabPunch:20180814065518p:plain

 

 

 作成されたNewNiagaraParameterCollectionを開き、

+ボタンからColorを新規で追加してみます。 

f:id:CrabPunch:20180814065525p:plain

f:id:CrabPunch:20180814065533p:plain

 

 

 Colorが追加できたら後の実験でわかりやすいように

いつものように色を赤色にでも設定してみてください。 

f:id:CrabPunch:20180814065553p:plain

f:id:CrabPunch:20180814065604p:plain

 

 

 

NPCアセットの設定ができたのなら再度Emitterに戻り

Palameterの追加をみると

NPC.NewNiagaraParameterCollection.NewLinearColor

というパラメーターが追加できるようになっています。

f:id:CrabPunch:20180814065613p:plain

 

 

内部の値的には先程設定した赤色が入っているはずなので

Colorにドラッグしてみます。

f:id:CrabPunch:20180814065623p:plain

f:id:CrabPunch:20180814065632p:plain

 

 

 

Blueprint(BP)との連携

 先程パラメーターを参照するEmitterをSystemに紐づけ。

Level上に配置してみます。

f:id:CrabPunch:20180814065645p:plain

 

次にLevelBlueprintあたりの開始に、

GetNiagaraParameterCollection

にて自分が作成したNPCアセットを指定します。

f:id:CrabPunch:20180814065702p:plain

 

その後、

SetColorParameter

にてColorの名前を指定して

色を変更します。

f:id:CrabPunch:20180814065711p:plain

 

 

この状態でPlayをすると先程のBPが動作するので以下のように

parameterの中の値を動的に変更することができます。

f:id:CrabPunch:20180814065725p:plain

 

 

 

注意

NPCアセットのNamespaceのリネームに関して、

この状態でのColorのParameterのnamespaceは

NPC.NewNiagaraParameterCollection.NewLinearColor

となっています。

f:id:CrabPunch:20180814065737p:plain

 

ここでNewNiagaraParameterCollectionからMyNiagaraParameterCollection

にリネームすると

なぜかColorのNewLinearColorのところが

前回のフルの名前になってしまいます。

f:id:CrabPunch:20180814065747p:plain

 すでに配置しているEmitter内の参照なども一部おかしくなります。

f:id:CrabPunch:20180814065759p:plain

本来であればColorの名前は

NewLinearColorのままで、

フルのNamespace自体が

NPC.NewNiagaraParameterCollection.NewLinearColor

から

NPC.MyNiagaraParameterCollection.NewLinearColor

となるのが適切な動作なきもしますが、

現状リネームするなどした場合は、内部のパラメーターなど再度作りなおすなり、

個別に名前を指定しなしてやらないといけないので

注意してください。

 

Niagaraの入門(13) Preview

Niagaraの入門(13)

UE4確認バージョン  4.20.1

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

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

Previewについて

 

これまでパーティクルを配置してきて、

動作確認をしていて思ったのですが、

Previewが見づらいです。

背景の色のせいでわからないので、

 

おそらく私以外の全てのUE4使いの方が、知っている今更の話ですが、

自分のための備忘録としてのとこなのでメモがてら残しておきます。

 

f:id:CrabPunch:20180812171137p:plain

 

f:id:CrabPunch:20180812171233p:plain

 

f:id:CrabPunch:20180812171306p:plain

 ここの設定で背景を消したり、

床を表示したり、

背景用のCubeMapを変更したりなどができます。

 

f:id:CrabPunch:20180812171344p:plain

 

すっきり。

 

UE4にVectorFieldsを取り込んでみた

UE4VectorFieldsを取り込んでみた

 

 

UE4確認バージョン  4.20.1

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

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

 前書き

VectorFieldsを使ったことがなかったので勉強がてら

作成して、UE4に取り込んでみようと思います。

VectorFieldsの作成はMayaでもできるのですが、

今回は使ったことないので、折角なので

VectorayGenを使用してみます。

 

参考資料

●DL

https://jangafx.com/vectoraygen-sales/

  

チュートリアル

https://jangafx.com/vectoraygen-starter-tutorial-series/

 

●VectorayGenの使い方とUE4での取り込み方

https://www.youtube.com/watch?time_continue=1&v=TGbY0aUVZIM

 ※主にこの動画の通りに作成すれば今回の上記にあげた動画のようなものが

つくれます。ブログの中身はあくまでそこをなぞったものになります。

●VectorFieldsとは

ベクトル場ともいいますが、空間内のベクトルの分布をしめすものです。

今回は空間をグリット状に管理して、それぞれの小さい空間ごとに

ベクトルを持たした情報ファイルを作成します。

 

 

 

 

 

●VectorayGenでのVectorFieldsの作成

 ・手順1

VectorayGenを立ち上げ。

 

NodeInfoタブの上にて右クリックをしfadeノードを作成。

fadeノードのプロパティのminを[-250]max[-50]とします。

 

f:id:CrabPunch:20180812173649p:plain

作成したfadeノードをダブルクリックすると以下のようになります。

f:id:CrabPunch:20180812173830p:plain

 

 

 

・手順2

次に続けて、rotateノードを作成し、fadeノードと繋げます。

rotateのangleを[45.0]とします。

f:id:CrabPunch:20180812174102p:plain

f:id:CrabPunch:20180812174235p:plain

 

・手順3

続けて、randomノードの作成と、interpolateノードを作成して

以下のように繋ぎます。

 

f:id:CrabPunch:20180812174518p:plain

f:id:CrabPunch:20180812174551p:plain

f:id:CrabPunch:20180812174601p:plain

・手順4

最後に上のメニューからファイルを出力します。

ファイル拡張子はfgaファイルになります。

f:id:CrabPunch:20180812174939p:plain

 

 

UE4上での取り込み

  ・手順1

UE4のコンテンツブラウザ上に、先程出力したfgaファイルをドラッグし。

 

f:id:CrabPunch:20180812175444p:plain

  

  ・手順2

パーティクルシステムを作成し、GPU設定にします。

f:id:CrabPunch:20180812175553p:plain

f:id:CrabPunch:20180812175604p:plain

  ・手順3

 そうするとVectorFieldが選べるようになるのでLocalVectorFieldを作成します。

先程取り込んだVectorFieldアセットを指定します。

f:id:CrabPunch:20180812175733p:plain

f:id:CrabPunch:20180812175748p:plain

 

  ・手順4

次にSpawnを選んでSpawnRateを5000ほどに。

 

LocationのSphereを作成。

サイズを250ほどとします。 

f:id:CrabPunch:20180812175807p:plain

 

f:id:CrabPunch:20180812175822p:plain

f:id:CrabPunch:20180812175835p:plain

 

  ・手順5

最後にLocalVectorFieldのTightnessを1にして

パーティクルのマテリアルとカラーをお好みで。

以上おしまい。

 

f:id:CrabPunch:20180812175853p:plain

 

 

 

●なぜVectorFieldsを取り込んだのか?

最近Niagara関連の勉強のためにいろいろやっていたのですが、

その過程でNiagaraのほうでもVectorFieldが使える(予定のようです

現状VectorFieldファイルを取り込んで、Field情報をサンプルするところまでは

確認したのですが、どうにも動作が不安定で

フォーラムを見ても、まだ実装途中とのことのようです。

f:id:CrabPunch:20180812180447p:plain

f:id:CrabPunch:20180812180500p:plain

f:id:CrabPunch:20180812180509p:plain

 

 

 

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

 

 

 

 

 

 

Niagaraの入門(12) ParameterとNamespace

Niagaraの入門(12)

UE4確認バージョン  4.20.1

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

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

ParameterとNamespaceについて

EmitterやModuleとのやりとりで主に扱うParameterについてなのですが

これらはNamespace管理されています。

Namespaceとはプログラムなどで変数やClassなどの定義が

名前でされるのですが、プロジェクトやプラグインなどによって

同名のような名前がある場合に、競合をさけるために

複数の名前の集合で管理することによって回避するためのものです。

例)xxxx.aaaa.hogehoge

 

Emitter内で定義するところがここにあたります。

ここで定義されているカテゴリーが主に、

namespaceの最初につける必要があります。(一部例外あり)

例)Emitter.hogehogeA

例)Particles.hogehogeB

この一番最初の名前にさえ従えば基本あとは自由な名前設定と型のタイプを指定できます。

f:id:CrabPunch:20180801190950p:plain

 

主に使用するものはSystem.  Emitter. Particles. でパラメーターを定義して

使用することが多いかと思われます。

Engine.は参照することはあって定義することはそうそうないかとは思います。

こちらはゲームでの経過時間などUE4の内部から必要な値を使うがほぼほぼかと思われます。

 

ParameterCollection」 「 User」 「Other」に関しては、もう少し情報が集まってから再度書くかもしれません。

 ・ParameterCollection

http://crabpunch.hatenablog.com/entry/2018/08/14/071940

 

・User

http://crabpunch.hatenablog.com/entry/2018/08/16/221858

 

なぜ今更この話をしたか?

単にパラメーターとは変数なようなものですよ程度の理解さえしておいて

いただければ説明することもないかとは思っていたのですが、

前回の記事のNormalの時の話と手順前後となってしまい恐縮です。

 

お気づきのかたも居られたかと思いますが、

前回の記事の途中で出てきた、

 

[Particles.SampleStaticMesh.MeshNormal]

これはどこから出てきたのか?

定義はしているがどこで値を設定しているのか?

SampleStaticMeshの中をみても、一見設定されているようには見えません。

ただ似たような名前の[Particles.Module.MeshNormal]というものは設定されています。

 

f:id:CrabPunch:20180801192427p:plain

 

 

 

実験

 新規にEmitterを作成して

3つのパラメーターを定義します。

f:id:CrabPunch:20180801193013p:plain

 

 次にModuleの2つ作成します。

中身は以下の通りで、

Module名前をMyTestColorAとMyTestColorBとします。(中身はまったく同じものです)

 

f:id:CrabPunch:20180801193235p:plain

f:id:CrabPunch:20180801193428p:plain

 

次に[Particles.MyTestColorA.Color][Particles.MyTestColorB.Color]

のパラメーターをそのままColorModuleにて代入すると結果がわかるかと思います。

f:id:CrabPunch:20180801194004p:plain

f:id:CrabPunch:20180801194016p:plain

 

つまりModuleのMyTestColorAの内部で設定された

[Particles.Module.Color][Particles.MyTestColorA.Color]となり

 

MyTestColorBの内部で設定された

[Particles.Module.Color][Particles.MyTestColorB.Color]となっていることが

わかります。

 

 

 よって

[Particles.SampleStaticMesh.MeshNormal]

これはどこで設定されたものか?

SampleStaticMeshで設定されていた

[Particles.Module.MeshNormal]で代入されたものである

ということがわかります。

 

Bitmaskついて

たとえばParticlesモジュール内でEmitterの値をMapSetしようとしても

候補にでてきません。

下流から上流への書き込み制限だと思っていました。

f:id:CrabPunch:20180826105540p:plain

 

左上のモジュールの詳細パネルのBitmaskにて

f:id:CrabPunch:20180826105635p:plain

Emitter項目を追加します。

f:id:CrabPunch:20180826105704p:plain

 

こうすることによってMapSetにてEmitterを返すことができるようになります。

f:id:CrabPunch:20180826105741p:plain

 

 

Niagaraの入門(11) PositionとNormalとQuaternion

Niagaraの入門(11)

UE4確認バージョン  4.20.0

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

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

 Mesh表面へのパーティクル生成について

以前、SpawnとLocationでMeshの形への

パーティクルの生成の話をしましたが、

そこからの派生のお話。

 

SampleStaticMesh

パラメーター入力

[Module.StaticMesh]

パラメーター出力

[Particles.Module.MeshNormal]

[Particles.Module.MeshTangent]

[Particles.Module.MeshPosition]

[Particles.Module.MeshColor]

[Particles.Module.MeshUV]

[Particles.Module.MeshSampleCoord]

 

対象となるStaticMeshからランダムで三角ポリゴンを抽出し、

その座標や法線やカラーなどを取得します。

StaticMeshLocation

パラメーター入力

[Particles.SampleStaticMesh.MeshPosition]

[Particles.SampleStaticMesh.MeshNormal]

パラメーター出力

[Particles.Position]

 入力で渡されたメッシュの位置や法線やオフセットをもとに

パーティクルの位置を決めるものです。

 

 


--------------------------------------------------------------------------------------------

 Mesh座標から矢印Meshを表示してみる

 SampleStaticMeshとしてConeのMeshを参照し。f:id:CrabPunch:20180730224426p:plain

矢印メッシュをスポーンで描画するように設定する。

f:id:CrabPunch:20180730224443p:plain

 

少し分かりづらいですが、矢印のメッシュがConeの形上に生成されているのがわかるかと思います。

f:id:CrabPunch:20180730224456p:plain

 矢印Meshを法線方向に回転させる

矢印Meshを参照もとのMeshの法線に合わせたいと思います。

ここでいう法線とは三角ポリゴンに対して垂直なベクトルです。

(頂点法線なんかもありますが)

 

矢印Meshを法線方向に回転させる方法として、

モデルの回転させるには、主にMatrixやQuaternionを用いることになります。

Matrixは4x4要素や4x3要素などの回転行列の計算が必要で、(※平行移動いれてるからじゃはなしのほうこうで)

素数の分だけ計算をしないといけなかったり、ジンバルロック問題。

回転順番の問題(Z>X>Y)(X>Y>Z)など色々問題があります。

 

QuaternionですとX,Y,Z,Wの四要素にて回転の表現ができます。

f:id:CrabPunch:20180730225933p:plain

こちらのSetVariablesでParticles.MeshOrientationにてMeshの向き指定できます。

ただ、このままですと指定がしづらいので。

DynamicInputsのFIndQuatBeweenTwoVectorsを追加してください。

 

f:id:CrabPunch:20180730230855p:plain

 

次にパラメーターをParticles.SampleStaticMesh.MeshNormalを作成し

ToVectorにドラッグしてください。

f:id:CrabPunch:20180730231403p:plain

 

これは2つのベクトルからQuaternionを計算するものです。

中身はこんなかんじ

f:id:CrabPunch:20180730231627p:plain

 

これにて矢印Meshが法線方向に回転することができるはずです。

 

f:id:CrabPunch:20180730231823p:plain

 

Niagaraの応用練習(1) ライン模様 

Niagaraの応用練習(1)

UE4確認バージョン  4.20.0

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

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

 ライン模様 

基礎編ばかりだと流石にあきるでしょうし、

機能の説明で、「で?それどう使うの?」

と言う方もおられるでしょうし、

今まで説明した機能の応用で、

ラインで模様を書いてみようと思います。

今回やった結果を貼ると。

f:id:CrabPunch:20180729104606p:plain

 

 動画版がこちら 

 

 

 前置き

 詳細な作り方を説明するまえに、大雑把な説明だけ

最初に書こうかと思います。

プログラムやマテリアル、エフェクトは

既存のものを真似てから勉強にもなるかと思いますが、

自分自身でのどのようなものを作りたいか

構想してからそのものがつくれればより楽しいかと思います。

考え方を読んでわからない場合に詳細は足しておきます。

 

作り方(概要)

・ラインの表示はRibbonRenderで行う(入門4の応用)

・親Emitterで円の動きをするModuleを作る(入門7と9と10の応用)

・親の動きを子EmitterのRibbonにて追従する(入門10の応用)

※ここまでくればほぼ完成のようなもの

 

・あとは円の動きを再生しながら、一定の確率で円の半径を大きくしていく

以上おしまい。

 

 

 

 

作り方(詳細)

 手順1 パラメーターを用意する

 用意するパラメーターは7個で

・Particles.CircleTime

パーティクルの円の経過時間のためのカウンターです。

・Particles.CircleSpeed

円の描画速度。360度を基準に角度で速度を表しています。

5というのは5度づつ円が進むという意味です。

(デフォルトは5度)

・Particles.CircleLv

円の大きさの段階

・Particles.CircleLvPer

円 大きくなる確率0-100%(デフォルトは5%)

・Particles.CircleInitLength

円の初期の半径

・Particles.CircleAddLength

円の初期の半径に対してParticles.CircleLvに応じて

半径を大きくする値。

・Particles.CircleDir

円の回転方向が時計周りか、反時計周りか

  

 

f:id:CrabPunch:20180729110603p:plain

 

f:id:CrabPunch:20180729110735p:plain

 

 手順2 Moduleの作成

パーティクルの円の動きをするためのModuleを自作します。

場所はParticleUpdateに「UpdateCircle」をいう自作Moduleを追加しましょう。

f:id:CrabPunch:20180729111940p:plain

 outputとinput

f:id:CrabPunch:20180729112408p:plain

 

f:id:CrabPunch:20180729112336p:plain

全体図

f:id:CrabPunch:20180729113709p:plain

 円の位置計算

f:id:CrabPunch:20180729114320p:plain

 確率

f:id:CrabPunch:20180729114345p:plain

最終の繋がり

f:id:CrabPunch:20180729114415p:plain

 

 

 手順3 EmitterにModule追加

上記のUpdateCircleを親Emitterに追加して

子EmitterにてRibbon描画すれば、ほぼ完成です。

 

 手順4 SystemにEmitterを追加

上記で作ったEmitterをSystem2つ追加して、片方だけParticles.CircleDirを逆設定すれば

右回りと左回りそれぞれが表現できます。

f:id:CrabPunch:20180729115131p:plain