Niagaraの入門(14) Niagara Parameter Collection (NPC) BPとの連携
Niagaraの入門(14)
UE4確認バージョン 4.20.1
※なおこの段階ではNiagaraはアーリーアクセスなので
※今後内容がかわるかもしれないのでご注意ください
NiagaraParameterCollectionについて
以前お話したParametersのところにあるNiagaraParameterCollectionですが、
(略 NPC らしい、、誤解うみそう、、)
Emitter上から追加しようとするとすでにいくつか候補がでるだけで新規で追加ができません。
追加方法としては
コンテンツブラウザのアセット作成からNiagaraParameterCollectionを選び
作成されたNewNiagaraParameterCollectionを開き、
+ボタンからColorを新規で追加してみます。
Colorが追加できたら後の実験でわかりやすいように
いつものように色を赤色にでも設定してみてください。
NPCアセットの設定ができたのなら再度Emitterに戻り
Palameterの追加をみると
NPC.NewNiagaraParameterCollection.NewLinearColor
というパラメーターが追加できるようになっています。
内部の値的には先程設定した赤色が入っているはずなので
Colorにドラッグしてみます。
Blueprint(BP)との連携
先程パラメーターを参照するEmitterをSystemに紐づけ。
Level上に配置してみます。
次にLevelBlueprintあたりの開始に、
GetNiagaraParameterCollection
にて自分が作成したNPCアセットを指定します。
その後、
SetColorParameter
にてColorの名前を指定して
色を変更します。
この状態でPlayをすると先程のBPが動作するので以下のように
parameterの中の値を動的に変更することができます。
注意
NPCアセットのNamespaceのリネームに関して、
この状態でのColorのParameterのnamespaceは
NPC.NewNiagaraParameterCollection.NewLinearColor
となっています。
ここでNewNiagaraParameterCollectionからMyNiagaraParameterCollection
にリネームすると
なぜかColorのNewLinearColorのところが
前回のフルの名前になってしまいます。
すでに配置しているEmitter内の参照なども一部おかしくなります。
本来であればColorの名前は
NewLinearColorのままで、
フルのNamespace自体が
NPC.NewNiagaraParameterCollection.NewLinearColor
から
NPC.MyNiagaraParameterCollection.NewLinearColor
となるのが適切な動作なきもしますが、
現状リネームするなどした場合は、内部のパラメーターなど再度作りなおすなり、
個別に名前を指定しなしてやらないといけないので
注意してください。
UE4にVectorFieldsを取り込んでみた
UE4にVectorFieldsを取り込んでみた
(´・ω・`)おほーっ pic.twitter.com/YgERujrcuM
— カニパンチ (@CrabPunch) August 12, 2018
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とは
ベクトル場ともいいますが、空間内のベクトルの分布をしめすものです。
今回は空間をグリット状に管理して、それぞれの小さい空間ごとに
ベクトルを持たした情報ファイルを作成します。
(´・ω・`)らんらん♪ pic.twitter.com/E0dmhDfcQj
— カニパンチ (@CrabPunch) August 12, 2018
(´・ω・`)やんやん? pic.twitter.com/PJhib5qX18
— カニパンチ (@CrabPunch) August 12, 2018
(´・ω・`)そっかー pic.twitter.com/tAmL4aN3a5
— カニパンチ (@CrabPunch) August 12, 2018
●VectorayGenでのVectorFieldsの作成
・手順1
VectorayGenを立ち上げ。
NodeInfoタブの上にて右クリックをしfadeノードを作成。
fadeノードのプロパティのminを[-250]max[-50]とします。
作成したfadeノードをダブルクリックすると以下のようになります。
・手順2
次に続けて、rotateノードを作成し、fadeノードと繋げます。
rotateのangleを[45.0]とします。
・手順3
続けて、randomノードの作成と、interpolateノードを作成して
以下のように繋ぎます。
・手順4
最後に上のメニューからファイルを出力します。
ファイル拡張子はfgaファイルになります。
●UE4上での取り込み
・手順1
UE4のコンテンツブラウザ上に、先程出力したfgaファイルをドラッグし。
・手順2
パーティクルシステムを作成し、GPU設定にします。
・手順3
そうするとVectorFieldが選べるようになるのでLocalVectorFieldを作成します。
先程取り込んだVectorFieldアセットを指定します。
・手順4
次にSpawnを選んでSpawnRateを5000ほどに。
LocationのSphereを作成。
サイズを250ほどとします。
・手順5
最後にLocalVectorFieldのTightnessを1にして
パーティクルのマテリアルとカラーをお好みで。
以上おしまい。
●なぜVectorFieldsを取り込んだのか?
最近Niagara関連の勉強のためにいろいろやっていたのですが、
その過程でNiagaraのほうでもVectorFieldが使える(予定のようです)
現状VectorFieldファイルを取り込んで、Field情報をサンプルするところまでは
確認したのですが、どうにも動作が不安定で
フォーラムを見ても、まだ実装途中とのことのようです。
Niagaraの応用練習(2) 木のような表現 (再帰的処理)
Niagaraの応用練習(2)
UE4確認バージョン 4.20.1
※なおこの段階ではNiagaraはアーリーアクセスなので
※今後内容がかわるかもしれないのでご注意ください
木のような表現
再帰型でつくればすぐやろとおもったら思いのほか手こずった。GDCであったような再帰での木のようなエフェクトを自作。#UE4#Niagara pic.twitter.com/afiL0VOYXD
— カニパンチ (@CrabPunch) August 2, 2018
今回は再帰的処理の応用のお話です。
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を発行し、
葉をスポーンさせます。
解像度の都合分かりにくいかもしれませんが、
幹(赤)
枝(青)
葉(緑)
とスポーンできるようになると以下のようになります。
(ブログ用) pic.twitter.com/UJmyM88xpo
— カニパンチ (@CrabPunch) August 3, 2018
手順3 位置通知のEventModuleを自作する
今回1つのEmitterからEvent発行が2つ必要になります。
1つは一定タイミングで子をスポーンさせるためのEvent
もう1つは定期的に現在座標を通知して、ラインを描画してもらうためのEvent
発行Eventが2つになると受け取るほうの問題として
どちらのEventを受け取るかの判断が必要になります。
NiagaraのEventは名前で管理されているので
1つのEmitterからEvent発行するときはEvent名を変えてあげないと
他からそれぞれが認識できません(もしかしたら他にスマートな方法があるのかもしれない)
こうするとEventの受け手側で2つEventが見れて選ぶことができます。
手順4 各スポーンから生まれたものに対して追従のパーティクルを作る
上記のEventで生成した毎フレーム位置の受信をするものにあわせて
ラインを生成します。
一旦、わかりやすく。
幹(赤)
枝(青)
葉(緑)
とします。
結果は以下のとおり。
手順5 最後に整える
最後はスポーン元のパーティクルの表示を消し。
ライン用パーティクルのマテリアルやらパラメーターを
好みに調整します。
※人によってはパーティクルをConeのようなMeshにして
それから入門でお題にだしたNormal方向に子を生成すると
いったやり方なども面白いかと思います。
Systemの構成としては以下のようになります。
Niagaraの入門(12) ParameterとNamespace
Niagaraの入門(12)
※なおこの段階ではNiagaraはアーリーアクセスなので
※今後内容がかわるかもしれないのでご注意ください
ParameterとNamespaceについて
EmitterやModuleとのやりとりで主に扱うParameterについてなのですが
これらはNamespace管理されています。
Namespaceとはプログラムなどで変数やClassなどの定義が
名前でされるのですが、プロジェクトやプラグインなどによって
同名のような名前がある場合に、競合をさけるために
複数の名前の集合で管理することによって回避するためのものです。
例)xxxx.aaaa.hogehoge
Emitter内で定義するところがここにあたります。
ここで定義されているカテゴリーが主に、
namespaceの最初につける必要があります。(一部例外あり)
例)Emitter.hogehogeA
例)Particles.hogehogeB
この一番最初の名前にさえ従えば基本あとは自由な名前設定と型のタイプを指定できます。
主に使用するものは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]というものは設定されています。
実験
新規にEmitterを作成して
3つのパラメーターを定義します。
次にModuleの2つ作成します。
中身は以下の通りで、
Module名前をMyTestColorAとMyTestColorBとします。(中身はまったく同じものです)
次に[Particles.MyTestColorA.Color]と[Particles.MyTestColorB.Color]
のパラメーターをそのままColorModuleにて代入すると結果がわかるかと思います。
つまり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しようとしても
候補にでてきません。
※下流から上流への書き込み制限だと思っていました。
左上のモジュールの詳細パネルのBitmaskにて
Emitter項目を追加します。
こうすることによってMapSetにてEmitterを返すことができるようになります。
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を参照し。
矢印メッシュをスポーンで描画するように設定する。
少し分かりづらいですが、矢印のメッシュがConeの形上に生成されているのがわかるかと思います。
矢印Meshを法線方向に回転させる
矢印Meshを参照もとのMeshの法線に合わせたいと思います。
ここでいう法線とは三角ポリゴンに対して垂直なベクトルです。
(頂点法線なんかもありますが)
矢印Meshを法線方向に回転させる方法として、
モデルの回転させるには、主にMatrixやQuaternionを用いることになります。
Matrixは4x4要素や4x3要素などの回転行列の計算が必要で、(※平行移動いれてるからじゃはなしのほうこうで)
要素数の分だけ計算をしないといけなかったり、ジンバルロック問題。
回転順番の問題(Z>X>Y)(X>Y>Z)など色々問題があります。
QuaternionですとX,Y,Z,Wの四要素にて回転の表現ができます。
こちらのSetVariablesでParticles.MeshOrientationにてMeshの向き指定できます。
ただ、このままですと指定がしづらいので。
DynamicInputsのFIndQuatBeweenTwoVectorsを追加してください。
次にパラメーターをParticles.SampleStaticMesh.MeshNormalを作成し
ToVectorにドラッグしてください。
これは2つのベクトルからQuaternionを計算するものです。
中身はこんなかんじ
これにて矢印Meshが法線方向に回転することができるはずです。
Niagaraの応用練習(1) ライン模様
Niagaraの応用練習(1)
UE4確認バージョン 4.20.0
※なおこの段階ではNiagaraはアーリーアクセスなので
※今後内容がかわるかもしれないのでご注意ください
ライン模様
基礎編ばかりだと流石にあきるでしょうし、
機能の説明で、「で?それどう使うの?」
と言う方もおられるでしょうし、
今まで説明した機能の応用で、
ラインで模様を書いてみようと思います。
今回やった結果を貼ると。
動画版がこちら
少しづつパラメーターやイベントの組み合わせがなれてきた。
— カニパンチ (@CrabPunch) July 28, 2018
思ったよりかっこよくなった(適当につくっただけだけど魔法陣っぽい)#UE4#Niagara pic.twitter.com/JGSMdDQ6qf
前置き
詳細な作り方を説明するまえに、大雑把な説明だけ
最初に書こうかと思います。
プログラムやマテリアル、エフェクトは
既存のものを真似てから勉強にもなるかと思いますが、
自分自身でのどのようなものを作りたいか
構想してからそのものがつくれればより楽しいかと思います。
考え方を読んでわからない場合に詳細は足しておきます。
作り方(概要)
・ラインの表示はRibbonRenderで行う(入門4の応用)
・親Emitterで円の動きをするModuleを作る(入門7と9と10の応用)
・親の動きを子EmitterのRibbonにて追従する(入門10の応用)
※ここまでくればほぼ完成のようなもの
円の動き
— カニパンチ (@CrabPunch) July 29, 2018
(ブログ用) pic.twitter.com/P31IfXRkgQ
・あとは円の動きを再生しながら、一定の確率で円の半径を大きくしていく
以上おしまい。
作り方(詳細)
手順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
円の回転方向が時計周りか、反時計周りか
手順2 Moduleの作成
パーティクルの円の動きをするためのModuleを自作します。
場所はParticleUpdateに「UpdateCircle」をいう自作Moduleを追加しましょう。
outputとinput
全体図
円の位置計算
確率
最終の繋がり
手順3 EmitterにModule追加
上記のUpdateCircleを親Emitterに追加して
子EmitterにてRibbon描画すれば、ほぼ完成です。
手順4 SystemにEmitterを追加
上記で作ったEmitterをSystem2つ追加して、片方だけParticles.CircleDirを逆設定すれば
右回りと左回りそれぞれが表現できます。