Game Dev Toolsは開発速度が早く、各HDAもどんどん改良されています。Vertex Animation Texture も改良されていたので今回はその中のFluid(Changing Topology)を紹介します。
この記事は下記のバージョンで作成しました。
Houdini 16.5.268
Houdini Game Dev Tools 1.7
UnrealEngine 4.18.1
HoudiniシーンファイルとUEシーンは下記にアップしました。
※ボーンデジタルHoudiniユーザーパスワードが必要です。
Vertex Animation Texture に関しては、下記を一度ご一読ください。
サルにもわかる Houdini:Vertex Animation Texture Unreal
バージョンが変わり上記の説明からさらにHDAがパワーアップしています。
下記のVimeoサイトからはLuizさんが作成したシーンを誰でもダウンロードすることができます。
Vertex Animation GDC Project Overview from Luiz Kruel on Vimeo.
1.Houdiniの設定
まずは、Unrealに持っていくエフェクトをPyroシェルフで作ってみます。
下記はPigheadを作成し、PyroFXシェルフのFrameをクリックして作成しています。
この中のpyro_importを開きます。
Vertex Animation Textureとして出力するためににはポリゴンデータにする必要があります。
import_pyro_visualizationの下に、isooffsetを追加し、オプションを下記のように変更します。
Offsetに関しては、ほしい形状になるように数値をそれぞれのシミュレーションごとに変えて試してみてください。
By Sizeは自分のほしい形状がとれるように設定します。後で、リダクションをかけるためここでは分割数をそれほど粗くする必要はありません。
このとき、ノーマルを表示すると実は裏返っています。
そこで、Reverseを追加し
ノーマルをひっくり返します。
次なる問題はポリゴン数が潤沢じゃないとエッジが切り立っています。
そこでAttribute Blurを追加し
ポジションにブラーをかけます。
次にポリゴン分割をみると多角形のポリゴンが多く含まれています。
そこで、Remeshノードを追加し、すべて三角ポリゴンに分割し、きれいなメッシュにします。
Vertex Animation Textureで出力されるポリゴンもすべて三角ポリゴンです。
次にPolyreduceを追加します。
Polyreduceノードは16.5で更新されており、このチュートリアルは16.5をベースに作成しています。
ReduceのTargetをOutput Polygon Countに設定し、NumerTo Keepに実際にゲームエンジンに出力する必要のある最大ポリゴン数を入力します。この値は、Vertex Animation Texture ノードで使用します。
次にAttributefromVolumeを追加し、下記のように接続します。
ここで、Pyroで作成したアトリビュートをポリゴンの頂点カラーとしてポリゴンにカラーします。
Import_Pyro_Visualizationの情報をみると、下記の2つのアトリビュートを持っています。
このTemperatureをあとで、カラー用のマスクとして使用したいと思います。
AttributefromVolumeに下記のようにLocal Variableにtemperatureと入力します。
次にPoint Wrangleでカラーをグレースケールに変更します。
頂点カラーのyを抽出し、さらに調整できるようにします。
式を入力したら横のスライダをクリックします。
値を調整します。
Attribute Blurを追加して頂点カラーをぼかします。
この結果をNullにつなぎます。
次にOUTにいって、GameDev Vertex Animation Texturesを作成します。この中ーとリアルではGameDevは1.7を使用しています。
Vertex Animation TextureでMethodを今回はFluidに設定します。
次にExport NodeでPyro_importを指定します。
Target Polycountは実際にFBXで出力されるポリゴン数です。出力時は3角ポリゴンでかつ各頂点が分離された形で出力されます。ここの数値は実際に先ほどしたポリゴンの最大値と同じになるように設定します。
そのため、先ほどPolyreduceで最大値を調整しました。
Target Texture sizeは出力するマップの横のサイズです。
現在のツールはNormalの結果をPositionマップのアルファにパックするようになっています。
更に先ほど作成したTemperatureを元にしたカラーデータも出力します。
ちなみにExport for Mobileボタンを使用するとメッシュとカラーには差異はありませんが、PositonMapが非常に小さくなります。
テクスチャ自体のピクセル数は同じです。
一番上のRenderボタンをおしてデータを出力します。
出力が終了すると、下記の3つのファイルができています。
ポジションマップのEXR(Normal情報はアルファに格納)
メッシュデータのFBX(頂点数は指定した数で固定)
カラーマップのEXR(Cdを出力した場合のみ)
ちなみにメッシュデータであるFBXをそのままUnrealで見てみると
三角ポリゴンが分割していることがわかります。
コンポーネントを確認すると、指定した10,000ポリゴンで頂点は三角ポリゴン単位で分割された30,000頂点であることがわかります。
出力された解像度を確認すると2048*1185という数字が見て取れます。
横は出力時に指定した2048ですが、縦のサイズはどのように割り出されたのでしょうか?
Vertex Animation Textureは頂点 (バーテックス) の変位をフレーム単位で格納し再生します。トランスレーション(移動)とノーマル(法線方向)を記録しています。これらの XYZ の各値が RGB チャネルにそれぞれバーテックス順にフレーム単位で最初のフレームから最後のフレームまで記録されます。
このデータは1-80フレーム間で出力しているフレームは79フレームです。
出力フレーム数(79フレーム)*Target Polycount(10,000)*3(1ポリゴンの頂点数)
を計算するとこのエフェクトのVertex Animation Textureを行うには2,370,000ピクセル必要なことがわかります。
縦の解像度は2048で指定しましました。
2,370,000ピクセル / 2048 = 1,157.22656...です。
このピクセルをカバーする値で近い値が縦に割り当てられていると思います。
出力が終了したらVertex Animation Textureノードの下にあるData for Realtime Shaderの数値を控えておきます。これはUnrealでシェーダーに入力する必要がある数値です。
さらにSample UE4 Shader Codeで今回使用したMethodのFluid Vertex Animation UE4 codeをコピーしておきます。後でUnrealで使用します。
ここまででHoudiniで必要な作業は終了です。
2.UnrrealEngine4の設定
UnrealEngineでプロジェクトを作成します。
Contentsの下にフォルダ(下記ではFluidVTAという名前にしました)を作成します。
Importボタンをクリックし先ほどHoudiniから出力したジオメトリデータ、カラーマップ、ポジションマップをImportします。
FBXインポートオプションが開きますが、デフォルトのままでImport Allボタンを押し読み込みます。
※読み込み時にSmoothing Groupがないといったようなエラーがでますが、そのままで大丈夫です。
まずはマテリアルを設定します。
一緒にロードされたConstantマテリアルの名前をわかりやすい任意の名前に変更してください。
マテリアルをダブルクリックしてマテリアルエディタを開きます。
BaseColorに接続されているノードは削除してください。
先ほどHoudiniでとっておいたShaderCodeを
UnrealEngine4のマテリアルエディタに貼り付けます。
すると下記のように必要なノードが作成されます。
Detailの目のアイコンをクリックして、Show All Advanced Detailsを有効にします。
デフォルトの設定だとパラメータがたりないため、全てのオプションを表示します。
Tangent Space Normalはオフにしてください。
New Customized UVsを3にします。
Customized UVが0-2まで追加されます。
各パラメーターを接続していきます。
コードをペーストした際に、どこに接続するのかコメントも記載されているので間違えることはありません!
このような感じで必要な接続をすべてつないでください。
Saveして、Materialエディタを閉じます。
Material Instanceを作成します。
Material Instanceをダブルクリックしてエディタを開きます。
Parentに先ほど作成したマテリアルを選択します。
表示されたパラメーターで下記を有効にします。
Houdiniで取得したBoundingMaxとBoundingMin、Number of FramesをUnrealのシェーダーパラメーターに入力します。
Color MapとPositonMapをコンテンツエディタからドラッグします。
Saveして、Material InstanceのUIを閉じます。
次にMeshをダブルクリックで開きます。
Detailタブ>Build SettingsでUse Full Precision UVsを必ずオンにします。この工程を飛ばすと、メッシュが正しく表示されず壊れたようにみえます。この設定は忘れがちなので注意してください。
Apply Changesボタンをクリックし、メッシュのUIを閉じます。
メッシュをビューポートにドラッグして、メッシュのマテリアルに先ほど作成したInstanceをドラッグして割り当てます。
きちんとVertex Animation Textureが再生されました!
次の問題は縦のテクスチャ解像度が2のn乗にできないということです。
これは違う記事で説明したいと思います。