こんにちは、Houdiniでパーティクルを使ってVFX的なエフェクトを作ってみたい!
そんな時にとても良いチュートリアルを見つけました。
▼Houdini In Five Minutes 12: Setting Up Particles
たった7分にパーティクルの基本が詰まっているので、備忘録としてメモを残しておこうと思います。
目次
HoudiniでParticleEffectを作る事前準備
Happy new year!という文字型にパーティクルで打ち抜かれるようなエフェクトを作りたいと思います。
フォントノードで文字を作る
まずは、フォントノードで文字のもとになるメッシュを作ります。
この時、Hole Faces のチェックを外します。
するとメッシュが重なってしまいますが、この後アウトラインを作るので問題ありません。
Endノードで文字メッシュの外形を抽出する
Endノードを使って外形のラインを抽出します。
Close Uのところのプルダウンから、Unroll with New Pointsを選びます。
Sortノードでプリミティブの順番を左から順に変える
Sortノードを加え、PrimitiveSortをX方向からにして左から順に打ち抜かれるようにします。
ポイントを確認してみるとかなりまばらに打たれている事が確認できるので、Resampleノードを入れます。
Resampleノードで同じ間隔で点を打つ
Resampleノードで点を細かく等間隔に打ちます。Lengthパラメーターを初期値の1/10にします。
Group by range ノードで現行フレームと関連付けて点を選ぶ
GroupByRangeノードをいれ、GroupNameにemitと名前をつけ、GroupTypeをPointに。
RangeTypeをStartAndLengthにして、0から10の値を取ります。
0は開始地点なので、それを現行フレームの$FFに関連付けます。
最初の7フレームを引いたものに7を掛けるようにします。
掛ける数が大きいほどフレーム数が早く進むという仕組みになっています。
これで事前準備が整いました。これからPOPネットワークを繋げます。
HoudiniでParticleEffectを作るためのPOPネットワーク
POPネットワークを繋げると、アニメーションフレームに合わせて点が出てくるだけです。
これから設定を整えていきたいと思います。
POPnetworkノードの中を確認する
POPnetworkノードをダブルクリックしてダイブインすると、PopObject、POPSource、Merge、POPSolver、output、があります。
Mergeはここでは一つしかつながっていないので何もしていないとして、それぞれが何をしているのか気になるところです。
POPnetworkとはDOPの一種なのかDYNAMICと右上に書いてありますね。
POPObjectにはParticleが格納されているという事と、Outputが出力ということぐらいしかこの時点ではわかりません。
よくわからないですが取り急ぎ重力を加えてみます。
GravityForceノードを追加する
Gravityを入れるとアニメ―ションを再生した時、生成されたParticleが落ちていきます。
POPSolverの下に入れるのが正しいようです。
POPSourceの設定を変えParticleに初速を与える
POPSourceの設定のattributeのInitialVelocityをデフォルトからSetVelocityに変えます。
すると、アトリビュートのvの値を参照するのではなく、ここでベクトル値を入力できるようになります。
どうやら、このPOPSourceとはParticleの生成に関する設定が詰まっているように見えます。
Z方向に値を入れたので、横に初速が加わりました。
Variance(分散)に値をいれてランダムな幅を持たせる
PopSourceのattributeのVarianceに値をいれて分散させます。ランダムな幅を持たせるようなことではないかと思います。
これでアニメーションを再生するとバラバラに点が飛んでいくのが観測できます。
POPDragノードで空気抵抗をシミュレーションする
ただのDragではなくPOP Dragを使ってAirResistance(空気抵抗)を与えます。
アニメ―トすると大分早い段階で初速が弱まり、フワッと下に落ちます。
Birth の設定でLife Expectancyでどの程度生き残るかの長さを設定する
POPSourceの設定のBirthの下の方にあるLife Expectancyに値を入れて(デフォルト100)短い時間でパーティクルが消えるようにします。
同様にLife Varianceにも値を入れて、ランダムでバラバラに消えるようにします。
GroundPlaneノードで床に衝突を表現する
POPSolverとGravityの間にMergeを入れて、AffectRelationshipをMutualにし、GroundPlaneを追加します。
すると、パーティクルがGroundPlaneに当たり止まるようになります。
これでほぼやりたいことはできました。これからこれをUnityにVATで持っていき、レンダリングしたいと思います。
Houdiniで作ったParticleEffectをUnityで確認するためにEXPORTする
ParticleをUnityに持っていくにはVAT(VertexAnimationTexture)が軽くて良いので、簡易的なシミュレーションであれば簡単にできます。
OUTにVATノードを作成して設定する
まずはnullをpopnetの最後において名前をGEOとか何か付けます。
networkのobjと書いてあるところをクリックしてプルダウンのOtherNetworksのoutというのをクリックします。
すると空のOutputネットワークに入れるので、VertexAnimationTextureノードを置きます。
まず、設定のMode/TargetEngineにParticleSprites(Sprites)を選択し、Unityを選びます。
すると、自動的にReal-TimesShadersの設定もUnityに書き換わります。
Input Geometryには先ほど名前を付けたNullノードのGEOを選択して、どのアウトプットをレンダーするか指定します。
Settingのタブを押し、Card ShapeをTriangle Cardsにしておくことで、多少軽くなります。
これはパーティクルの形です。
また、ExportCustomAttributeのTargetTextureWidthでシミュレーションに使う適正なテクスチャサイズの幅を指定します。
私は、今回のアニメーションには4096を使いました。1024の倍数で十分な大きさにするのが良い気がします。
ExportタブのExportPathにアウトプット先のフォルダを指定しておきます。
ここに、テクスチャと、メッシュ、マテリアルが吐き出されます。
VAT3を使う場合はデフォルトでOKですが、環境によって、VAT1を使う場合はパラメーター含め設定が違うので注意です。
今回はUnityのURP用のVAT3の設定です。(VAT1の場合は下の図の〇部分をクリックして違う設定をする必要があります。)
最後に、RenderAllボタンを押すとウィンドウが出てきてレンダリングが始まります。
エラーが出る場合は、ポイントの数やテクスチャサイズを変えてリトライしてみてください。
私はid情報がないというエラーが出たので、WrangleにVEXでptnumをidにコピーして対処しました。
なんのことやらさっぱりでしたが、とりあえずこれでエラーを回避できました。
すると指定した先に以下のようなフォルダが出てきます。
それでは、このフォルダに入っているファイルをUnityで読んでみます。
Houdiniで作ったParticleEffectをUnityで確認する
私がVATインポート時に参考にしているのは以下の公式チュートリアルです。
URP用なので、プロジェクトはURPで作成しておきます。
▼VERTEX ANIMATION TEXTURES IN UNITY
2つ目のチュートリアルにUnityのインポート法が書いてあります。
それによるとWindow>PackageManagerからアセットを読み込みます。
PackageManagerの+マークからプルダウンを出して、Add package from disk を選び、Houdiniのインストールフォルダを参照します。
私の場合は以下のパスにURP_VAT3というフォルダがありましたので、それのpackage.jsonを開きます。
これでVATshaderのインストール完了です。
それでは、先ほどの3つのフォルダをASSETフォルダの中に投げ込みます。
それぞれのファイルに設定をしていきます。
まずgeoフォルダのOBJメッシュをクリックし、インスペクター上で〇がついているところをクリック。
VAT_FBXなんとかという設定をダブルクリックします。
すると設定が適応されるので、Applyを押して確定します。
次に、Texフォルダの2つのファイルcolorとPosition両方を選択した状態で、インスペクター上で同様の作業をします。
スイッチみたいなマークをクリックして、VAT_HDRというのをダブルクリックし、Applyで確定します。
そして、最後に、matフォルダに入っているマテリアルをクリックし、インスペクター上で確認し、
positionファイルと、colorファイルをそれぞれ必要なスロットにドラッグアンドドロップします。
その2つのファイルとは先ほどのTexフォルダに入っていたファイルの事です。
geoフォルダのメッシュをヒエラルキーウィンドウにドラッグアンドドロップします。
そして、今作ったばかりのマテリアルをあてがうと、メッシュが動くはずです。
PlaybackSpeedはスピードをいじれるので、割合を指定します。
私は0.213を入れて遅くしました。
その他、パーティクルが大きすぎる場合は、GlobalParticleScaleMultiplierに小さな値を入れてみましょう。
これで基本的な挙動は見えるはずです。
Houdiniで作ったParticleEffectをUnityで味付けする
さて、デフォルトのテクスチャでは色を付けてないので、味気ないかと思います。
本来ならHoudiniで色を付ければよいのですが、今回はColorのEXR画像に適当にダウンロードしたEXR画像を張り付けて上書き保存しました。
ランダムに色を付けるのであれば十分です。
GlobalVolumeのBloomを調整して、明暗をいい感じになるよう設定します。
ここら辺の値は、適当です。
カメラを置いて、再生してみます。
まとめ
今回は、Houdiniで火花を散らして文字を書くParticleEffectを作り、UnityにVATを使って持っていきました。
様々なノードを使って、少しだけPOPnetworkと仲良くなれたかなと思います。
ついでに、UnityのVAT(POP用)設定を紹介しました。
これからも、HoudiniやUnityを使っていろいろな創作活動をしていきたいと思っています。
それでは、また!