Epic Gamesが配布している、Unreal Engineの様々な機能のサンプルをまとめたプロジェクト「機能別サンプル(Content Examples)」の中に、UE4.26では、Niagara AdvancedというMapがあります。
そこでは、Niagaraの新機能やそれを使った応用例など、とても参考になるサンプルが多く配置されていて、実装内容を見てみるとたくさんの学びがあります。
それらのサンプルについて、いくつかの記事に分けて解説を行っていきます。
ちなみに、機能別サンプルはEpic Games Launcherのラーニングタブからダウンロードできます。また、UEのバージョン毎に内容が違うので注意してください。
TLDR;)
- Particle Attribute Readerを使えば同じEmitterもしくは別のEmitterのParticleのAtrribute情報を取得することができるよ
- 情報の取得には、Execution IndexかParticle IDでどのParticleの情報を取得するか指定する必要があるよ
- 読み取る側と読み取れる側が同じSim Target同士である必要があるよ
はじめに
この記事では、Particle Attribute Readerについて解説していきます。
Particle Attribute Reader は、4.25の時からもありましたが、4.26でサンプルも充実してきているのと、かなり使い勝手の良い機能なので、ここで解説します。
名前の通り、他のEmitterや同じEmitterのParticleのAttribute情報をExecution IndexやIDを指定することで取得することができる機能です。
今回は、Niagara Advancedにある、「2.1 Particle Attribute Reader」、「2.2 Follow The Leader 1.0」、「2.3 Spawn Particles Another Emitter」の3つのサンプルの解説を行うことで、この機能の基礎を理解していきたいと思います。
Particle Attribute Reader は、CPU SimでもGPU Simでも使用可能ですが、読み取る側と読み取られる側が同じSim Targetである必要があります。
2.1 Particle Attribute Reader の解説
※ 上のgif画像の中には、上部のものと、下部のRingのものの2つのNiagara Systemがありますが、上の方は単純な内容なので、ここでは、下のRingの方のみ解説していきます。
一つのパーティクルが円周上を周り、通過した所から色が変わっていくようになっています。
中身は、LeaderとRingの2つのEmitterからなっています。
Leaderの方は、円状にくるくる回り続ける1個のSpriteです。生存中にちょうど一周するようになっていて、Spawn時に色がランダムで決まります。
Ringの方は、円状に均等に配置されたParticleで、Leaderがいない状態だとずっと白色です。これに、LeaderのColor Attributeを取得し反映することで、色がついていきます。
ちなみに、この円状に均等に配置する方法ですが、Torus Locationモジュールを使い、DistributionをDirect Modeにしたうえで、Radius Positionに定数、U PositionにReturn Normalized Exec Indexを入れることで実現できます。地味に便利な情報が載っていてよいですね。
さて、肝心のParticle Attribute Readerですが、Emitter Spawnで初期化されています。Emitter Nameのところに、読み取りたいEmitterの名前を入れることで、読み取り対象を指定できます。
そして、Read Color from Emitter(Scratch Padモジュール)で、Leaderの色情報を読み取り、反映する処理がかかれています。
Get {データ型} By Indexというノードで、Particle Attribute ReaderとParticleのIndexを入力し、読み取りたいAtteibute名を指定することで、その情報が取得できます。
IndexはExcution Indexと同じで、ここでは、Leaderが常に1つのParticleしか持ってないため、0を入力すれば、そのParticleから情報を取得することができます。
Scratch Pad内の他の部分では、自分のPositionとLeaderのポジションの距離が、設定した閾値より小さければ、Leaderの色に自分の色を変えるということをやっています。
それによって、Leaderが通過した所のParticleからLeaderと同じ色に変わっていくような表現を実現しています。
シンプルですが、基礎がつまった内容になっています。
2.2 Follow The Leader 1.0 の解説
このサンプルは、赤いパーティクルがフヨフヨ動いていて、その周りに緑のパーティクルが一定の距離を保ちながらついていくようなものになっています。
今回も、LeaderとFollowersの2つのEmitterで構成されています。
Leadersはお察しの通り、赤い浮遊物体です。Spawn Burst Instantaneousで22個のParticleを出し、後はCurl Noise ForceやVortex Forceなどで浮遊させています。
一点だけ言及すべき点があるのは、Emitter PropertiesのRequires Persistent IDsにチェックが入っていることです。
これは、後ほどParticle Attribute Readerで値を取得するときに、Execution Indexではなく、Particle IDで取得するためです。
Execution Indexは、処理が行われる順番なので、Particleが継続的に死んだり生まれたりする場合は、新しく生まれたParticleに既に死んだパーティクルに対応していたExecution Indexが使用されたりします。
それに対し、Particle IDの方は、ParticleとIDが一対一で対応するので、重複を考えずに処理をすることができます。
状況によってどちらを使うべきか変わるので、その都度どちらが適しているかを考える必要があります。
次にFollowersの方です。前のサンプルと同じく、Emitter SpawnでParticle Attribute Readerを初期化しています。
次に、OffsetというAttributeを作り、適当な長さのランダムなVectorを作っておきます。これは、赤いLeaderから一定の距離を保つ部分に使われています。
あとは、Initialize FollowersでついていくべきLeaderのParticle IDを決め、Update Followersで実際に追従していく処理をつくっています。これらは、どちらもScratch Padモジュールです。
Initialize Followersの方を見ていきます。
まず、Particle Attribute Readerから、Get Num ParticlesでEmitterのその時のParticleの総数を取得します。今回は22個なので、1を引くことで、0~21のインデックスを得て、Calculate Random Range Indexを使い、ランダムで0~21の中から一つのインデックスを決めます。
そのインデックスをもとに、Get ID at Spawn Indexを使って、Particle IDを取得します。
そのParticle IDは、Leader IDとして保持しておきます。これで、自分がついていくLeaderとなるParticleのIDを決めることができました。
また、そのIDをもとにParticle Attribute Readerから、Get Vector by IDを使って、Attributeを取得します。
Attribute名にNoneが入っていますが、これはおそらくPositionの間違いで、取得したLeaderのPositionに先ほど設定したOffsetの値を足して、自分のPositionとしています。
続いてUpdate Followersですが、ここでは、Initialize Followersで保持したLeaderIDをもとに、自分がついて行っているLeaderのPositionを取得し、それにOffsetを足した値に向かっていくように、Velocityを与えています。
単純にPositionを上書きするのではなく、Velocityを使ってその方向に向かわせることで、少し遊びがでて、より自然についていっている感が出ています。
最後に、Velocityを使っているので、実際にParticleを動かすには、Solve Forces and Velocityモジュールが必要なので注意してください。
2.3 Spawn Particles Another Emitter の解説
最後に、Spawn Particles Another Emitterの解説です。このサンプルは、Particleがランダムに放出され、その軌跡に新たなParticleが生まれているような表現で、Ribbon Rendererと似たようなものです。
ただ、Ribbon RendererはGPU Simでは動作しないので、GPU SimでもRibbon Rendererと同じような表現ができることが注目ポイントです。
また、このサンプルは前述の2つと違い、自前でScratch Padを実装するのではなく、UEが用意してくれているモジュールが使われています。このモジュールは、他のEmitterをベースにParticleを操作することに特化したモジュールになっています。
詳しく見ていきましょう。
お決まりの通り、LeadersとFollowersの2つのEmitterで構成されています。
Leadersの方は、ランダムにParticleを上方に放出しているだけです。詳細は割愛します。
Followersの方で重要なのは、Spawn Particles from Other EmitterとSample Particles from Other Emitterの2つのモジュールです。この2つはセットなので、二つとも追加する必要があります。
まず、Spawn Particles from Other Emitterを見ていきます。
Emitter Nameに元となるEmitterの名前を入れます。
Spawn Rateは、1秒間にいくつSpawnさせるか、Calculate Spawn Rate Per Particleはチェックを入れると、元EmitterのParticle毎にSpawn Rateを適用するようになります。今回は、22×50=1100のParticleが1秒間にSpawnされます。
Spawn Rate Per Particle Capは、Particle毎にSpawnされる数の上限です。
次に、Sample Particles from Other Emitterを見ていきます。
Emitter Sampling Modeは、SequentialとRandomの二つが選べます。Randomを選ぶと、元EmitterのParticleの中からランダムに選んだParticleから、新しいParticleをSpawnさせるようになります。Sequentialは順番に選ばれます。
Filteringの項目では、3つの設定でもととなるParticleをフィルターします。
後の項目は、Particleの基本Attibuteで、Position, Color, Velocity, Massなどがあり、元となるEmitterの値を引き継ぐかを設定できます。
ドロップダウンをクリックすると、Disabled, Apply to Attribute, Output Onlyの3つを選択でき、Apply to Attributeだと、実際にSpawnされるParticleのAttributeに元Particleの値が引き継がれます。Output Onlyだと、反映はされないけれど、Output Attributeとして値を保持できます。
情報だけ使いたい時に便利です。
これで、他のEmitterのParticleをもとに、新たなParticleを発生させたり、各Attributeを引き継ぐことが、簡単にできるようになります。
おわりに
別のParticleの情報を知りたいというのは、よくある需要だと思いますが、Particle Attribute Readerのおかげで、とても簡単にそれを実現することができるようになりました。
以前までだと、Event Handlerを使ってイベントを発行し、それを使って他のParticleの情報を得るといったことをしていましたが、それを使うよりも、Particle Attribute Readerを使う方が簡単で、かつパフォーマンスも良いということです。
これはとても良い機能が実装されたと思います。さすがNiagaraです。
では、よきCGライフを!
One Comment