Niagaraノードについて


こちらの記事では、Niagaraノードの概要およびHoudiniとUnreal Engineを使用したHoudini Engineプラグインの使用事例についてご紹介します。事例では、Houdini Niagaraノードを使用してデータを出力し、Unreal EngineのNiagaraエフェクトを作成します。

Unreal Engine Niagaraのドキュメントは、Epic Games社公式ホームページに公開されています。併せてご覧下さい。

Niagaraとは

Unreal Engineの視覚効果エディタです。パーティクルエフェクトを作成し、リアルタイムでプレビューするために使用します。Niagaraは、Unreal Engineの次世代VFXシステムに位置付けされており、ナイアガラを使用することで、テクニカルアーティストはプログラマーの手を煩わせることなく、自身で追加の機能を作成することができます。VFXシステムは、容易に使用することができ、適応性と柔軟性に優れたシステムとして設計されています。Unreal EngineにおけるNiagara VFXシステムには、システム、エミッタ、モジュール、パラメーターの4つのコンポーネントがあります。

HoudiniとUnreal Engineの連携

事前に、Houdiniで計算したポイントクラウドの値(color、impulse、time、life、position、velocity、normal、idやtype等)をNiagaraのパーティクルへ渡すことで、Houdini内で計算した複雑なアニメーションや挙動をNiagara上で再現することが可能です。Houdini上での、破壊の計算は、SideFXLabsツールに含まれているRDB(リジッドボディ)ノード等を使用します。Houdiniからエクスポートされるデータは、hcsv(CSV形式)として出力され、Unreal Engineにインポートし、Niagaraで使用します。

Houdini Niagaraノードについて

Houdiniで使用することのできる、NiagaraノードはGeometryネットワーク内に4つあります。




Niagara ROP

一体化されたHDAであり、UE4 Niagaraデータインターフェースで使用可能なBulletシミュレーションからのimpactの出力、データ分割、 データの補間を行います。Niagara ROPを使用して.csv形式のデータを出力することができます。



Niagara Interpolate

Bullet RBDシミュレーションからのセントロイド (重心) をポイントクラウドとして、アニメーション全体を保存し、UE4 Niagaraデータインターフェースで使用します。



Niagara RBD Split

Bullet シミュレーションで2つの破片が分離する度にポイントを生成します。 UE4 Niagaraデータインターフェースでのパーティクル生成に使用できます。



Niagara Impacts

BulletのRBDシミュレーションから衝撃点を抽出、UE4 Niagaraデータインターフェースに必要なアトリビュートを追加します。

Niagara ROPノードを使用したUnreal Engineへのデータのエクスポート

それでは、Houdini Niagaraノードを使用して、Unreal Engineへcsv/fbxデータをエクスポートする手順についてご紹介します。
今回は、Houdini18.0.416を使用しています。最初に、Houdiniを起動してSideFXLabsツールが正常に読み込まれいることを確認します。

Geometryネットワークでテストオブジェクトを作成し、オブジェクトの落下シミュレーションを行うために、オブジェクトの高さをTransformノードで調整します。こちらでは、Test Geometry Pigheadの[Add Shader]をオフにして、シェーダーを非表示にしています。

Transformノードは、[TranslateY:10][ScaleXYZ:3]に設定しています。

次に、Labs RBD Fractureノードを使用して、オブジェクトをカットします。Labs RBD Fractureノードは、標準のVoronoi破砕よりもコントロールが豊富で、Labs RBD Material Fractureノードと比較した場合、シンプルに操作することができます。

■注目ポイント:[Visualizes] > [Visualize Pieces]にチェックを入れることで、ボロノイ分割した破片毎に色を割り当て可視化することができます。

Labs RBD Fractureノードの下に、Labs RBD Directorノードを接続します。[Activate at Frame:1]にすることで、静的な状態から1フレーム目でアクティブに切り替えることができます。

次に、Labs RBD Directorノードの下にLabs RBD Solverノードを接続します。

Impact Dataの[Generate Impacts][Display Impacts]にチェックを入れます。

Generate Impacts、Display Impactsをオンにすることで、衝突時の情報を生成して、視覚化することができます。

この状態でシミュレーションを再生し、結果を確認します。

RBD Solverノードの下にNiagara ROPノードを接続します。

[Preview]にチェックを入れ、ディスプレイフラグをオンにします。

次に、Niagara ROPノードのパラメーターについてご紹介します。
Impactsが有効な場合、衝突時の破片の位置及び方向情報を出力することが可能です。また、Splitを有効にすることで、ジオメトリが破砕するタイミング、位置や方向情報を出力することができます。デフォルトでは、パラメーターの[Impacts]にチェックが入っています。

今回は、デフォルトの[Impacts]にチェックが入った状態で進めます。オブジェクトが破砕し、地面に接触した際の位置、向きなどを確認することができます。

次に、[Render]ボタンをクリックして、.csvファイルを出力します。

保存先に、[export.csv]というファイルが出力されたことが確認できます。このファイルの拡張子を変更します。Unreal Engineに読み込むために、[export.hcsv]に修正します。

それから、破壊のメッシュを出力するために、RBD Solverノードの下にNullノードを接続します。名前を判別しやすくするため、ここでは[Anim]と入力しています。

メッシュをFBX形式で出力するために、ROP階層に移動し、Labs RBD to FBXノードを作成します。

パラメーターのNode To Exportには、SOP階層で作成したNullノード[Anim]を選択します。[Start/End/Inc:1,121,1]に指定します。次に、[Render]ボタンをクリックして、FBXを出力します。

以上で、出力するデータの作成は完成です。

今度は、Unreal Engineを起動します。こちらでは、Unreal Engine4.23.1を使用しています。Unreal Engineを起動後、[新規プロジェクト]を選択し、[空のプロジェクト]を指定後、[プロジェクトを作成]をクリックします。

Houdiniから出力した、FBX/CSVデータを読み込む前にHoudini EngineおよびNiagaraプラグインを有効化します。画面左上部の[編集] > [プラグイン]を選択します。

プラグインの[FX]を選択し、Houdini Niagara、Niagara、Niagara Extras[Enabled]にチェックを入れ有効化します。

プラグインのウィンドウを閉じて、Unreal Engineを再起動します。再起動後、Houdiniから出力したデータを読み込むために、画面下部にあるコンテンツブラウザの[インポート]を選択します。

export.hcsvファイルを選択して読み込みます。

コンテンツブラウザを確認すると、正常に.hcsvファイルが読み込まれたことが確認できます。

再度、[インポート]ボタンをクリックして、Houdiniから出力したアニメーションデータの.fbxファイルを選択します。

読み込む際に、FBXインポートオプションウィンドウが展開されます。Animationの[Import Animations]にチェックを入れ、Animation Lengthを[Animated Time]に変更します。また、Transformの[Import Uniform Scale:100]にします。パラメーターを変更後、[全てインポート]を選択します。
[Import All]ボタンをクリックすると、指定された設定で現在選択中のすべてのFBXファイルをインポートすることができます。

[全てインポート]をクリックすると、メッセージログが表示されます。パーティクルを生成するにあたって問題はないので、メッセージログをそのまま閉じます。

コンテンツブラウザを見ると、4つのアセット(スケルタルメッシュ・アニメーションシーケンス・物理アセット・スケルトン)が読み込まれたことが確認できます。今回は、主に[test_Anim]というアニメーションシーケンスを使用します。

次に、コンテンツブラウザの[新規作成]をクリックし、Niagara Emitterを作成します。

[FX] > [Niagara Emitter]を選択します。

選択すると、エミッターの開始点を選択するウィンドウが展開されます。今回は、[Omnidirectional Burst]という全方向性のテンプレートを使用します。[OK]をクリックします。

コンテンツブラウザから作成したエミッターをダブルクリックします。すると、新たにウィンドウが展開されます。下画像は、Niagara Emitterのデフォルトの状態です。
画像右側より、赤枠が今回主に使用するモジュールです。また、黄枠のモジュールはこちらでは使用しないので非表示にします。
※パーティクルを制作する上で後ほど追加するモジュールもあります。

最初に、タイムラインのフレームレートを調整します。Houdiniで出力したデータは24fpsで作成されているため、タイムラインの[240fps]をクリックし、展開されたプルダウンから[24fps(film)]を選択します。

ここからは、ジオメトリが落下し地面に衝突した際に、発生する煙を作成します。これ以降では、主にエミッターのモジュールを調整していきます。
最初に、Emitter Update内のモジュールを調整します。Emitter Updateの右端の[+]ボタンをクリックして、プルダウンから[Spawn Particles from Array Playback]を選択します。

Spawn Particles from Array PlaybackのHoudini Niagara > Houdini CSV Assetパラメーターのプルダウンを選択して、先ほど読み込んだexpor.hcsvファイルを選択します。
また、今回は[Spawn Burst Instantaneous]を使用しないので、チェックをオフにします。

次に、Emitter Life Cycleの[Complete On lnactive]にチェックを入れます。また、[NextLoopDuration:5.0]に設定します。

次に、Particle Spawnのモジュールを調整します。
Particle Spawnの右端の[+]ボタンから[Handle Spawned Houdini Particles by Type]を選択します。

Handle Spawned Houdini Particles by TypeのHoudini CSV Assetのプルダウンから、先程と同様にexport.hcsvファイルを選択します。

また、今回は[Calculate Size by Mass]、[Sphere Location]、[Add Velocity from Point]は、使用しないのでチェックをオフにします。

下画像は、この状態でタイムラインを再生した結果です。パーティクルが下方向に発生していることが確認できます。

次に、煙のような効果を作成するため、パーティクルに対してシェーダーを割り当てます。

Sprite Rendering > Material > Default Sprite Materialを選択し、プルダウンから[M_smoke_subUV]を指定します。

そして、Sub UV > Sub Image Size[X:8.0、Y:8.0]に指定します。

下画像は、Sub Image Sizeの数値を調整した結果です。デフォルトの数値1.0と8.0を比較すると、数値8.0はより煙に近い状態になったことが確認できます。

再度、Particle Spawnに戻り、Initialize Particleモジュールを調整します。
Sprite Attributes > Sprite Sizeにチェックを入れ、ここでは[X:150、Y:80]と値を変更します。

すると、スプライトのサイズが変更されサイズが大きくなったことが確認できます。

次に、Particle Update内のモジュールを調整します。Gravity Forceのチェックをオフにします。

オフにすることで、地面より下方向に放出されていたパーティクルが制御されていることが確認できます。

次に、スプライトのサイズを調整します。Sprite Size Scale > Curveを設定します。こちらでは、下画像のようにカーブを調整しています。

また、パーティクル発生時のカラーを設定します。Scale Color > Curveを調整します。ここでは、下画像のように設定しています。

カラーを調整後、再度、Particle Spawnに戻り、Initialize Particleモジュールの[Color]のチェックをオフにします。

ここまで設定した状態で一度、アセットを保存します。画面左上部の[保存]ボタンをクリックします。

以上で、Niagara Emitterの調整は完了です。次に、生成したエミッターからNiagara Systemを作成して、アニメーションシーケンスに対してパーティクルを割り当てます。
コンテンツブラウザに戻り、作成したNiagara Emitterアイコンを右クリックします。プルダウン上部の[Create Niagara System]を選択します。

すると、コンテンツブラウザにNiagara Systemが作成されたことが確認できます。

次に、コンテンツブラウザ内の[test_Anim]というアニメーションシーケンスをダブルクリックします。

クリックすることで新規でウィンドウが展開されます。画像下部にあるトラック上を右クリックし、[通知を追加] > [Play Niagara Particle Emitter]を選択します。

すると、トラックの1フレーム目にPlay Niagara Effectが割り当てられたことが確認できます。

Play Niagara Effectを選択して、右側の詳細パネルからAnim Notify > Niagara Systemのプルダウンから、作成したNiagara Systemを選択します。

この状態でタイムラインを再生すると、アニメーションが開始して、破片が地面に接触した際に煙が発生していることが確認できます。

下画像は、アニメーションの1フレーム目と110フレーム目の結果です。

このように、Houdini Niagaraノードを使用してデータを出力することで、Unreal EngineのNiagaraエフェクトを作成しアニメーションデータに割り当てることができます。
また、各モジュールをさらに調整することで、より現実に近いエフェクトを作成することができます。





■補足 1
今回、HoudiniからFBXデータを出力する際、1フレームから121フレームで書き出しています。

通常の1フレームから120フレームでFBXデータを出力した場合、Unreal Engineに読み込んだ際、119フレームが読み込まれます。

この状態でNiagaraエフェクトを割り当てると、再生時に1フレーム欠けた画が表示されるため、こちらでは、Houdiniから出力するFBXのフレーム範囲を調整しています。




■補足 2
今回、Houdiniでは24FPSで120フレームのデータを作成しているため、Unreal Engine Niagara EmitterのEmitter Life Cycle > Next Loop Durationを5.0に設定しています。
何故そのような設定を行うかと言うと、エミッタのループに必要な時間を入力するため、総フレーム数をフレームレートで割った数値を入力しているからです。

また、Houdiniでフレームレートを確認する場合、タイムスライダー左端のアイコンをクリックします。

Global Animation Optionsウィンドウが展開され、アニメーションのフレームレートを確認することができます。



■HoudiniおよびUnreal Engineの対応バージョンについて
2020年5月14日時点、最新のHoudiniプロダクションビルドは「Houdini18.0.460」です。こちらのバージョンのHoudini Engine for Unreal は、「Unreal Engine4.25.0」に対応しています。

Niagaraノードを使用したHoudiniとUnreal Engineのデータの受け渡しについて以上となります。アセットをNiagaraノードで出力し、Houdini Engineを有効化することで、Unreal Engineで容易にデータを読み込むことができます。