見出し画像

Houdiniで作成した破壊エフェクトをUEに持っていく方法


自己紹介

こんにちは、TD室で色々なことをさせていただいているひびきという者です。

この記事の目標

何をするにしても目標を決めておかないとどこまで書けばいいのかわからなくなってしまうので、目標とこの記事がどのレベルの人向けなのかを定めておこうと思います。

この記事ではHoudiniで作ったエフェクトをUnreal Engine(以下UE)に持っていくところまでを目標としようと思います。(記事の名前の通りですが…)
記事の最後に自分がエラーが出たところや、つまずいたところをまとめておきますので、同じようなことをやってうまくいかない点があれば確認してみてください。

UEとHoudiniの基本操作がわかる方向けに書いています。
そのため、完全な初心者向けではないかもしれません。
逆に、HoudiniやUEを完璧に使いこなしているCG仙人みたいな人はここでブラウザバック推奨です。

作業環境

メモリーの量やGPUの性能で、できるできないがあるので自身の環境を載せておきます。

  • CPU: Ryzen Threadripper Pro 5955 WX 16-Cores

  • MEMORY: 128GB

  • GPU: NVIDIA GeForce RTX 4080

  • Houdini 20.0.625

  • Unreal Engine 5.3.2

プラグイン

  • SideFX_Labs 20.0

  • HoudiniNiagara 2.6.0

本編

ここから本編です。
「へぇ〜、こんなことできるんだ〜」くらいの軽い気持ちで見てもらえたら嬉しいです。

環境を整えよう

HoudiniのデータをNiagaraに持っていくためには、いくつか環境を整えないといけません。
Houdini側ではSideFX Labsのプラグインを入れる必要があります。
https://www.sidefx.com/ja/products/sidefx-labs/

UE側ではHoudini Niagaraのプラグインの追加が必要です。
https://github.com/sideeffects/HoudiniNiagara/releases

UEにはVATのプラグインも追加しなければいけないのですが、Houdini側からプラグインを取得しなければいけないので、後ほどHoudiniからVATのデータを書き出した際に説明します。

Houdiniからのデータの書き出し

簡単なデータ作成

この記事を書くにあたり簡単な破壊モーションを作成しました。
サンプルとして壊していくのは、Side Effectsのテストジオメトリ PigTest(豚ちゃん)です。https://www.sidefx.com/ja/docs/houdini/nodes/sop/testgeometry_pighead.html

簡単にですが破壊します。

この破壊したオブジェクトは4つの要素で構成されます。

  1. 破壊されたオブジェクト本体

  2. デブリ

  3. パーティクル

この4つをHoudiniから書き出すには各々違う書き出し方をする必要があります。
各々をHoudiniから書き出し方を説明していきます。

破壊オブジェクトの書き出し

破壊オブジェクトは以下の画像のオブジェクト本体を指します。

これをUE向けに書き出す場合Vertex Animation Textures(以降VAT)を使用します。

VATを使う際にHoudini側ではPieceごとにパックされているオブジェクトである必要があります。
そのオブジェクトのPoint Attributeorientpivotが入っている必要があります。
RBDでシミュレーションをしている場合、初めから必要なアトリビュートが出るようになってないので、OutputタブのTransfer Attributesで出力アトリビュートを設定します。orientとpivotを追加してください。

ROPに移動して、Labs Vertex Animation Texturesを出してInput Geometryにジオメトリノードのパスを指定します。

Render Allを押すことでExport Pathで指定したフォルダにVAT用のFBXが作成されます。
指定したフォルダ以下にgeoとtexというフォルダができてfbxとexrのファイルができます。

これでオブジェクトの書き出しは終わりました!…ただ、これだとUE側ではまだ使えないので、HoudiniからUEのプラグインを取得していきます。

UEのプラグインを取得する

UE内でVATを使用するためにはUE用のプラグインを入れなければいけません。

HoudiniのLabs Vertex Animation TexturesReal-Time Shader内のUnreal Engine Content Plugin and Guidesボタンを押すとUE用のプラグインが表示されます。

自分が使用しているUEのバージョンにあったフォルダをコピーして、UEのプロジェクト内にあるプラグインフォルダに入れてください。

UE内での使用方法は後半で説明します。

パーティクルの書き出し

パーティクルは下記のようなものを指します。

パーティクルを書き出すときはLabs Niagara ROPを使用します。

パーティクルを生成しているDOP下にNiagaraROPをいれてRenderを押すことで保存できます。

パーティクルのデータが書き出されました。

デブリの書き出し

デブリは以下の画像のようなものを指します。

デブリはパーティクルにCopyToPointsで破片をコピーしてます。

コピーする際に、バリエーションができる様にvariantのアトリビュートを作成して、7種類の破片をrandomでコピーするようにしました。
近づいてみてみると一個一個形が違います。

コピーする際にPiece Attributeを設定することで各デブリの形にvariantが設定できます。

コピー元のパーティクルをLabs Niagara ROP を使って書き出していきます。
その際に、Keep Attributesでvariantを足しておくことでNiagara側でその数値を使用できます。
variantは、各パーティクルに対応するオブジェクトがどれかを示すアトリビュートです。ここではrotも渡すように、指定を追加します。
rotには回転情報が入っています。

これで書き出します。

それに加えて、デブリオブジェクトをHoudini内で作成している場合は、デブリのオブジェクトをfbxで書き出します。

今回はデブリオブジェクトのバリエーションが7種類あるので、7種類書き出します。
これでデブリを書き出す準備はできました。

煙の書き出し

煙はそのまま煙の部分を指してます。

File Cacheを使ってVDBファイルを作成します。

これで煙のデータの書き出しは完了です。

UEでの再現

Houdiniでの操作が終わりました!
お疲れ様です。
ここからはUEの方で再現していく作業になります。
まずは豚のオブジェクトをインポートして、破壊していきましょう!

VAT(Vertex Animation Textures)で破壊オブジェクトを持っていく

Houdiniからのデータの書き出しで作ったfbxとテクスチャをドラッグアンドドロップします。

Remove Degenerates
Build Reversed Index Buffer
Generate Lightmap UVs
One Convex Hull Per UCX
Combine Meshes
をオフにしてfbxをインポートします。

テクスチャはposとrotだけ使うのでそれをインポートします。
下記のようになります。分かりやすく名前を変更します。

マテリアルを作成します。

マテリアルの親ノードを選択してNum Customized UVsを5に変更します。

マテリアルの中でvatと調べ、Houdini_VAT_RigidBodyDynamicsを選択します。

下記のようにノードを繋げます。

元々のオブジェクトを再現するために必要なテクスチャなどを繋げてマテリアルは完成です。

コンテンツブラウザに戻り先ほど作成したマテリアルを右クリックして「Create Material Instance」を選択しマテリアルインスタンスを作成します。

マテリアルインスタンスを開いてHoudini FPSをHoudini側と合わせ、Position TextureとRotation Textureに各々テクスチャをアサインしていきます。

テクスチャをStatic Meshにアサインして、破壊オブジェクトの完成です!

レベルにドラッグアンドドロップするとHoudiniと同じように崩れてくれます。

Niagaraでパーティクルを再現

パーティクルの動きをNiagaraで再現していきます。
Houdiniの方で出したhbjsonをUE内にドラッグアンドドロップします。

Houdini Point Cache Assetが作成されます。
これも分かりやすいように名前を変更します。

一旦Houdini Point Cache Assetは置いておいて、次にNiagara Systemを作成します。

Show all にしてLibrary Onlyをオフにし、Parent Emittersを選択
Houdiniと検索すると、Houdini Niagara Basicというのが見つかるので
これを選択してNiagara Assetを作成します。

この2個があればOK。

NiagaraSystemを開いたらEmitterの中の
Spawn Particles from Houdini Point Cache
Sample Spawned Houdini Point Cache
Sample Houdini Point Cache
を選択して各々に自分が入れたHoudini Point Cacheをアサインします。

位置は再現されてそうですが少しでかいですね。
大きさを変更していきます。

Particle Spawnを選択してSprite Sizeを10から1にします。

良くなってきました。最後に色を合わせます。

Sample Spawned Houdini Point Cacheを選択して、右上の三本線?を選択してShow Parameter Writesを選択するとそのノードが書き出しているパラメーターを確認できます。するとそこにPARTICLES HOUDINI ColorとHOUDINIから色情報が出ていることが確認できます。

Particle Spawnの下にcolorを作成してColorの右のVのような物を押してMake Linear Color from Vector and Floatを選択。

Colorを選択してVectorの方にPARTICLES HOUDINI Colorをドラッグアンドドロップすると色が変わりました。

一旦これで完成です。

デブリを再現

デブリを再現していきます。
デブリもNiagaraで再現するので、パーティクルと同じくhbjsonと書き出したfbxを全てインポートしていきます。

メッシュのマテリアルから準備していきます。といってもここで準備するのはパーティクルの色を適用させるだけの物なので、Particle ColorをBase Colorに繋げただけの物です。

これをメッシュにアサインしていきます。

ここからNiagaraの設定をしていきます。
先ほどパーティクルを作成した時と同じ様にHoudini Niagara Basicを選択して、Niagara Systemを作成。
作成したNiagara Systemもパーティクルと同じように、
Spawn Particles from Houdini Point Cache
Sample Spawned Houdini Point Cache
Sample Houdini Point Cache
を選択して各々に自分が入れたHoudini Point Cacheをアサインします。
これでデブリの位置は再現できました。
ここにデブリの形を当てはめていきます。

デブリのデータはメッシュなので、Sprite Rendererのチェックを外し、Mesh Rendererを追加します。

Meshesの一番右にある+ボタンを連打してIndexを7個(デブリのバリエーションの数)作成します。

下のbindingsの中のMesh Index Bindingを使ってメッシュをポイントに割り振っていきます。ここの値でどのパーティクルにどのメッシュが割り振られるかを決められます。

ここから少し難しいかもです。頑張って丁寧に説明していきます、、、(がんばってついてきてください)
MeshIndexを設定するModuleを作成していきます。
Particle SpawnにNew Scratch Pad Moduleを選択して新しくModuleを作成します。

Map Getの+ボタンを押してHoudini Point Cache infoを選択。

Parametersを選択してActive Overviewを選択して、PARTICLES HOUDINI NIDをMap Getにドラッグアンドドロップ。

EMITTER Ageもドラッグアンドドロップ。

次にParametersのActive OverviewなかのParticle Attributesの+を選択して PARTICLES MeshIndexを選択。

次にMap SetにPARTICLES MeshIndexをドラッグアンドドロップ。

今こうなっているはずです。

Houdini Point Cache infoからピンを引っ張ってGet Point Value at Time by Stringを選択。

画像の様にピンを繋げます。

Get Point Value at Time by StringのAttributeをvariantに設定します。

左上のApplyを押してvariantを設定するModuleは完成です。
これでHoudiniから書き出したDataからvariantを取得して、そのvariantのデータをMesh Indexに入れることができました。

System Overviewを選択して戻りましょう。
戻ったら、作成したmodelを選択して、Houdini NiagaraにHoudini Point Cacheをアサインします。

するとちゃんとバリエーションが割り振られました。

ただこれだとまだメッシュが回転しません。
そのためHoudini側でデータを書き出す時にvariantと一緒に選択したrotを使用していきます。その前に前準備です。Particle Spawn にInitial Mesh Orientationを追加してください。

また新しいModelを作成していきます。ただ今回はParticle Updateに作成していきます。

先ほどと同じ様にMap Getを作成していきます。
Ageだけ先ほどと違く、EMITTER AgeではなくPARTICLES Ageにしてください。

Particle Attributesの+を選択してMesh Orientationを追加します。
それをMap Setにドラッグアンドドロップします。

今下記のようになっているはず。

Houdini Point Cache Infoのピンを出しGet Point Quat Value at Time by Stringのノードを出します。そして下記の様にノードを繋げます。

attributeをrotに変更してapplyを押して完成です。

System Overviewに戻ったらHoudini Point Cacheをアサインすることを忘れずに!

するとちゃんと回転するようになります。

最後にパーティクルの時と同じようにParticle SpawnにColorを作成して、Make Linear Color from Vector and Floatを選択してHOUDINI Colorをアサインしてメッシュの色を変更してデブリは作成できました。

煙の再現

あともう少しで完成です。
最後は煙です。
まず作成したvdbファイルをドラッグアンドドロップします。

OpenVDB Import Optionsが開くのでそのままimport。

AnimatedSparseVolumeTextureがインポートされます。これも分かりやすい様に名前を変更しておきます。

マテリアルを作成します。
Material Domain をVolumeに、Blend Mode を Additiveにします。

Sparse Volume Texture Sample Parameterのノードを作成。

そして下記の様にSparse Volume TextureにAnimatedSparseVolumeTextureをアサインします。

下記の様にノードを繋げます。

LevelにHeterogeneous Volumeを出します。

作成したマテリアルをElement 0にアサインしてPlayingとLoopingにチェックします。

これで完成です。

全てを合わせてみる

レベルシーケンスを作成して、全てを合わせてみます。
VATのAuto Playbackをオフにします。

レベルシーケンスに入れDisplay Frameをシーケンスのフレームと同じにすることでシーケンス通りにVATを動かせます。

HeterogeneousVolumeもシーケンスにいれてFrameのアトリビュートをDisplay Frameと同じ様にしていきます。

そのうえでSequencer Curvesを開いて、アニメーションをリニアに変更します。

パーティクルのNiagaraSystemを入れてComponentを追加してComponentからSystem Life Cycleを追加してDesired Ageにすることでシーケンスのフレーム通りに動くようになります。
シーケンス内は下記の様になります。

完成!と思いましたがパーティクルが浮いるのと、煙の位置と色があってないですね…少し調整が必要です。

すこし調整して良くなりました!

お疲れ様です!
これで再現できました!

色々試すうえでつまずいたところ

2GBを超えるhbjsonはインポートはできるがセーブ時にクラッシュする。

  • UE5.3でのエラーかはわかりませんがhbjsonの大きさが2GBを超えているとセーブ時にUEが今のところ必ずクラッシュします。
    2GBを超える場合データの削減を考える必要があります。

Test Geometry Pigのテクスチャの取得

  • Houdiniのtest Geometry Pigのテクスチャはノードを右クリックしてType Properties ...を押すとEditorが起動して、Editorの右下にあるSave to Fileから外に出せます。

  • UEのパーティクルが光ってしまう問題

NiagaraのSprite Rendererに初期から入ってるマテリアルをみると
Emissive Colorにノードが繋がっているため光ってしまいます。

マテリアルを改めて作り直してBase Colorにすれば光りません。

あとがき

おつかれさまです!
ここまでお付き合いいただきありがとうございました!
2つのDCCをまたいでいるので大変だったりすると思いますが、
DCC側で色々整理されているので、興味を持ったら触れてみたら中々楽しめると思います!!

引用

SVT(Sparse Volume Texture)
Houdiniで作成したRigid Body用VATをUE5.3 で再生する

※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。


デジタル・フロンティアでは、テクニカルスタッフを随時募集しています。
まずは気軽に門戸を叩いてみて下さい。
一緒に日本のコンテンツ産業を盛り上げていきましょう!