UnityへVertex Animation Textureを読み込む際の設定方法、その他詳細設定について


こちらの記事では、UnityへVertex Animation Textureを読み込む際の設定方法や、各メソッドごとの設定方法、その他詳細設定についてご紹介します。
また、記事で使用しているLabs Vertex Animation Textures ROPノードについては、こちらをご参照ください。

記事で使用しているプロジェクトファイル等は、こちらからダウンロードすることができます。併せてご活用ください。

SideFXLabsツールのインストール手順

SideFX Labsツールセットのインストール手順については、以下の記事をご参照ください。

●Houdiniの内部システムからの直接インストール
●Githubからの手動インストール

Unityへの読み込みについて

こちらでは、Houdini18.0.592とUnity 2019.4.7f1を使用しています。
また、今回は下画像のような建物が崩れるシンプルなシミュレーションを使用します。

Vertex Animation Textureの作成

最初に、Houdini側でLabs Vertex Animation Textures ROPノードを使用して、VATデータの書き出しを行います。Outputsコンテキスト内で、Labs Vertex Animation Textures ROPノードを作成します。
ここではノード名を、Unity_Rigidに設定しています。

Parameter Viewを確認し、Methodパラメータが[Rigid(Rigid Body Topology)]、Engineパラメータが[Unity]に設定されていることを確認し、[Initialize for Engine]ボタンを押します。

次に、シミュレーションを出力しているノードをパスを使用して指定します。Choose operatorから読み込むノードを選択します。こちらでは、[_output]ノードを選択します。
以上でVATデータの出力の準備は完了です。

[Render]ボタンを押して、出力します。

出力されたファイルを確認します。デフォルトでは、Hipファイルの保存場所と同じ階層内にexportファイルが作成されます。Unity用の書き出し設定では、materialsフォルダの中にmatファイルが作成されます。


プラグインの読み込み

Unity用のプラグインが用意されているので、こちらを読み込みます。
このプラグインは、Houdini側でSideFX Labsをインストールした際に、併せてドキュメントフォルダ内にインストールされます。

■補足:誤って削除した場合や不具合がある場合は、シェルフツールの[SideFXLabs]にある[Update Toolset]を使用して、アンインストールを行い、再度インストールを実行することをお勧めします。

Labs Vertex Animation Textures ROPノードのParameter Viewに戻り、[Use Interface – Simple]を[User Interface – Normal]に切り替えます。

次に、Parameter Viewの下部に移動し、[Sample Shader Code]タブを開きます。タブの中に、[Unity Package Path]と書かれた項目があり、横にファイルアイコンがあります。これをクリックすることで、プラグインが保存されているフォルダまでのパスをコピーできます。

次に、Unityを起動します。
右上の[Windows]から、[Package Manager]を選択します。

Package Managerの+ボタンを押し、表示されるプルダウンメニューから[Add package from disk]を選択します。

エクスプローラーが展開されるので、先ほどLabs Vertex Animation Textures ROPノードの[Unity Package Path]からコピーしたパスを貼り付けます。パスをペーストすることで、package.jsonの保存場所が開かれるので、ファイルを選択して読み込みます。

[Package Manager]のUnity Registryを[In Project]を切り替えることで、ファイルが正確に読み込まれたかを確認できます。ロードに成功している場合は、SideFXという項目が追加されます。


ファイルの読み込みと設定

新規フォルダを作成し、必要なファイルをインポートします。Project Window内で右クリックし[Create]から[Folder]を選択します。

作成したフォルダ内に入り、Houdiniから出力したファイルを全てドラッグ&ドロップで読み込みます。

次に、Vertex Animation Textureに対して、Unityのシェーダー内で適切に読み込みを行うため、各種設定を変更します。
[Position Map][Rotation Map]を選択し、Inspector Windowを開きます。
そして、[sRGB(Color Texture)]のチェックを外します。これで、色情報ではなく、位置情報としてMapを読み込むことができます。

次に、[Non-Power of 2]パラメータを[None]に切り替えます。

Unityでは、テクスチャを読み込む際に、2の累乗にテクスチャのサイズをリスケーリングする機能が働きます。位置情報を記録したテクスチャのサイズを変更すると、位置情報がずれて、正確に機能しないため、この操作を行う必要があります。

[Generate Mip Map]のチェックを外します。この操作は、メモリの使用量を抑えるために行います。

次に、PC,Mac & Linux Standalone settingsを開き、[Override for PC, Mac & Linux Standalone]にチェックを入れて有効にします。その後、[Format]をRGB HDR Compressed BC6Hから[RGBA Half]に切り替えて圧縮します。最後に、[Apply]ボタンを押して設定を保存します。

[Unity_Rigid_mat]を選択し、Inspector windowを開きます。スロットが用意されているので、[Position Map][Rotation Map]ドラック&ドロップでセットします。SpeedやNumber of Framesパラメータの値は、自動で設定されます。

次に、fbxファイルを[Hierarchy window]ドラッグ&ドロップし、メッシュを読み込みます。

Hierarchy window内で読み込んだメッシュを選択し、Inspector windowにパラメータを表示させます。

Materialsタブ内に、スロットがあるので、[Unity_Rigid_mat]ドラッグ&ドロップします。このスロットの数は、Houdini内で設定されたマテリアルの数に一致します。
今回の例では、メッシュの外側と割れた時の断面にマテリアルを用意していたので、2つのスロットが作成されます。ここでは、2つのスロットに同じマテリアルを割り当てます。

UnityへのVertex Animation Textureの読み込みは以上です。以上で、Unityでの設定は完了です。


各メソッドについて

Labs Vertex Animation Textures ROPノードでは、現在4種類のシミュレーションがサポートされています。
ここでは、サポートされている各シミュレーションについて、ご紹介します。引き続き、こちらでは、Houdini18.0.592とUnity 2019.4.7f1を使用します。


Soft(Constant Topology):

こちらのメソッドでは、シミュレーションを通じてトポロジーが一定のジオメトリを扱うことができます。
トポロジーとは、図形の性質のことです。トポロジーの考え方では、図形をゴム膜として、伸びたり縮んだりするものとして捉えたとき、形状が変化するものは同じ図形であるとみなすことができます。
Soft(Constant Topology)では、ポリゴンの構造自体が変わらないシミュレーション結果を出力する際に使用することができます。
例えば、布のシミュレーションを行った場合は、トポロジーが変化しないので、Softとして出力ができます。

下のような旗のシミュレーションを出力してゲームエンジンへ読み込みます。

全てのメソッドにおいて、読み込みの際に行う手順は基本的には上記と同じです。

※Unreal Engine 4を使用する場合については、こちらの記事をご参照ください。

先ほどご紹介した、Unityへの出力データの読み込み方法をもとに、データをインポートします。
Softの場合は、exrファイル(Position Map)、FBXファイル、matファイル、jsonファイルが書き出されます。
これらのファイルを読み込んで表示を行った場合、Unityでは下の画像のように表示されることがあります。

修正前と修正後と比較すると、描画処理がかなり粗く行われていることが分かります。

また、法線の向きの影響により、裏の描画は、デフォルトの状態では行われません。その為、両面を描画するように、Unity側で設定を行う必要があります。

まず、描画の粗さを取り除く方法については、Position Mapのアルファ情報に法線情報を持たせるのではなく、別途、Normal Mapから法線情報を読み込む方法が有効です。

最初に、Houdini側で法線情報の書き出しを行うための設定をご紹介します。

Houdini内でLabs Vertex Animation Textures ROPノードに戻り、[Pack normals into Position Alpha]パラメータのチェックを外し[Normal]パラメータにチェックを入れます。
この操作でHoudiniから法線情報の書き出しを行います。

書き出されたNormal Mapに対しても設定を行います。[Normal Map]を選択し、Inspector windowを開きます。

sRGB(Color Texture)のチェックを外します。

[Non-Power of  2]パラメータを、ToNearestから[None]に変更します。

[Generate Mip Maps]のチェックを外します。

Normal Mapの[Max Size]を1024に変更します。

設定の変更を[Apply]ボタンを押して保存します。

続いて、マテリアルを選択してInspector windowを開きます。

[Pack Normals]のチェックを外します。

Normal Mapをスロットにドラッグ&ドロップで読み込みます。

以上の設定で、旗が滑らかに表示されます。


次に、裏面の描画についてですが、こちらはUnityの場合、プラグインとして用意されているShader Graph内の設定を1か所変更する必要があります。
[Shader Graph]は、[Packages]フォルダの中に用意されています。

初めに、Project widowで[Packages]フォルダの左側にあるアイコンをクリックし、開きます。

中あるに[SideFX Vertex animation Textures]フォルダを開きます。

[Editor]フォルダを開きます。

[Shaders]フォルダをクリックします。

[VAT_Soft_SG]を選択します。

Inspector window内にある[Open Shader Editor]ボタンを押すことで、Shader Graphが開かれます。

出力用のPBR Masterノードの歯車マークからメニューを開き、[Two Sided]にチェックを入れ、変更を保存します。

これで、旗の両面が描画されるようになります。

Rigid(Rigid Body Topology):

こちらのメソッドは、破壊のシミュレーションを行った際の頂点情報と回転情報を出力することができます。
Rigidの場合、出力されるデータは、exrファイル(Position MapとRotation Map)、FBXファイル、matファイル、jsonファイルになります。また、他のメソッドと異なり、テクスチャとして出力されるデータは、各頂点の情報ではなく、各破片の中心点の情報が出力されます。

例えば、下の画像では1つのボックスを5つの破片にボロノイ分割をし、5つの中心点(ボロノイセル)が存在します。

この結果を[Position Map][Rotation Map]に出力すると、下画像のように5つの中心点の情報が格納されます。

上記のことから、破片の中心点の頂点情報をPosition Map、回転情報をRotation Mapとして保存をすることで、シミュレーションによって計算された動きを出力します。
本メソッドは、破壊表現をゲームエンジン内で再現する場合に使用します。


Fluid(Changing Topology):

こちらのメソッドは、シミュレーション中にトポロジーの変化があるものを扱うことができます。特に、炎や水などの流体表現をゲームエンジン内で再現したい場合は、Fluidメソッドを使用することになります。

このメソッドを使用した際に書き出されるファイルは基本的には、Softメソッドと同じです。ゲームエンジンにメッシュを読み込む際には、分解されたメッシュを読み込む形になります。

また、FluidシミュレーションをVertex Animation Textureとして書き出す際には、ポリゴン数を削減してから出力することが多いと思います。この際によく利用されるノードが、PolyReduce SOPノードです。このSOPノードを使用し、最終的なプリミティブの数を調整することができます。

ポリゴン数を調整するパラメータは、Labs Vertex Animation Textures ROPノードにも用意されています。
出力する際に、先ほどのPolyReduce SOPノードの[Number to Keep]パラメータの数値と、Labs Vertex Animation Textures ROPノードの[Target Prim Count]パラメータの値を合わせ、更に、[Target Texture Size]パラメータの数値と合わせると、再構築した際にメッシュが破綻する確率が低くなります。


Sprite(Camera Facing Cards):

こちらのメソッドは、空間を移動するポイントを常にカメラを向くビルボードで表示をします。
Houdini側でパーティクルなどを使用してシミュレーションした点群アニメーションをVertex Animation Textureとして出力するためのメソッドです。ゲームエンジンに読み込むと、ビルボードとして表示されます。

出力されるファイルは、Soft、Fluidと同様に、exrファイル(Position Map)、FBXファイル、matファイル、jsonファイルです。FBXファイルをUnityで展開すると、下画像のような板状の構造が並んで表示されることが確認できます。

データとしては、点が並んでいる状態ですが、ゲームエンジン内では点ではなくビルボードで表示されるので、結果的に板が並んでいるように表示されます。

点群アニメーションを扱うことを目的としているので、ビルボードの高さと幅を調節し、スケーリングすることができます。これは、Houdini内で出力を行う前に設定することが可能です。

ゲームエンジン側に読み込んだ後でも、パラメータから変更可能です。Inspector window内に、[Width]パラメータと[Height]パラメータが用意されています。

これは、テクスチャを使用してパーティクルエフェクトのような形で使用することができます。その場合は、プラグインとして用意されているShader Graph内で、テクスチャ読み込み用のパラメータを作成する必要があります。

Project windowから[Package]フォルダを開きます。

SideFX Vertex Animation Texturesフォルダ下の[Editor]フォルダを開きます。

[Shaders]フォルダをクリックして開きます。

[VAT_Sprite_SG]を選択し、Inspector windowの[Open Shader Editor]ボタンを押します。Shader Graphが展開されます。

[Smaple Texture 2D]ノード[Multiply]ノードを作成します。

[Texture 2D Property]を追加します。これによって、テクスチャをShader Graphの外で設定可能にするためのスロットが作成されます。+ボタンを押し、[Texture 2D]を選択します。

同様に、[Color Property]を追加して、カラーを調節できるようにします。

[Texture 2D Property]をドラッグ&ドロップし、Shader Gpaph上に配置します。

同様に、Color Propertyに対しても、ドラッグ&ドロップでShader Graph上に配置します。

同配置したノードを下画像のように接続します。

Shader Graphの編集が完了した後、[Save Asset]ボタンを押して保存します。Inspector windowを確認すると、[Texture2D][Color]が追加されたことが確認できます。

テクスチャ画像を読み込みます。Scene上でビルボードに代わり、読み込んだ画像が反映されたことが確認できます。

下の動画は、使用したテクスチャ画像(左)と結果(右)です。
挙動の再構築に必要なPosition Mapの画像サイズが大きくなりやすいこと、また予めHoudini上で作成した挙動を再現することに限られるなど、有効活用できる場面は限られます。


座標系の設定について

Vertex Animation Textureを出力する際に座標系を考慮する必要があります。
Vertex Animation Textureとして、出力されるデータはHoudini内の座標系を基準として作成されます。そのため、読み込み先のゲームエンジンに座標系を変換する必要があります。

下画像は、HoudiniとUnity、Unreal Engine 4の座標系の比較です。

Houdiniを基準とした場合、
・Unityでは座標軸自体は同じですが、X軸の正と負の方向が逆になります。
・Unreal Engine 4は、Y軸方向とZ軸方向が逆になります。軸の方向はHoudiniと同じです。

このような違いを考慮して、設定を行う必要があります。

座標系の設定を調節するためには、Labs Vertex Animation Textures ROPノードのUser Interface – Simpleを、[User Interface – Normal]に切り替えます。

Parameter Viewの下部にオプションが追加されるため、この中にある[Position Coord]パラメータを確認します。Unreal Engine 4用の初期設定では、座標軸と軸の向きがそれぞれ、[XZY、+X+Y+Z]と設定されます。Unityの初期設定では、[XYZ、-X+Y+Z]と設定されます。

ここでは、Unreal Engine 4とUnityを例に挙げましたが、各企業またはユーザー自身で開発されたゲームエンジンを用いてゲーム開発を行っている場合、そのゲームエンジン内の座標系がHoudiniの座標系と異なり、変換が必要になる場合があります。
その場合は、最初に、[Position Coord]パラメータを確認することをお勧めします。


頂点情報とフレーム情報の設定について

Labs Vertex Animation Textures ROPノードは、内部で元となるシミュレーションからVertex Animation Textureを生成するネットワークが組まれているHoudini Digital Asset(HDA)の1つです。

Labs Vertex Animation Textures ROPノード(バージョン2.1)では、Unreal Engine 4とUnityへの出力設定は実装されていますが、その他のゲームエンジンは未実装となっています。
そのため、内製エンジンを使用する場合など、そのゲームエンジンに合わせた出力設定が現バージョンでは用意されていないことがあります。

こちらでは、例えば、ゲームエンジン側のシェーダーの関係で、テクスチャのUVを逆に設定する必要がある場合についてご紹介します。
この反転機能は、予め用意されていないので、HDAを編集する必要がありあます。

ここでは、画像のUV情報を逆に設定することで、横をフレーム情報、縦を頂点情報として保存します。

こちらでは、Rigidタイプを例としてご紹介します。

まず初めに、Labs Vertex Animation Textures ROPノードを作成し、右クリックから[Allow Editing of Contents]を選択し、HDAを編集可能な状態にします。

ROPノード内に入ります。
最終的に出力されるテクスチャ画像は、textures(COP2 Network)内で編集されます。今回ご紹介する方法は、画像編集を行う方法なので、COP Networkを使用します。
textures(COP2 Network)の中に入ります。

textures(COP2 Network)の中では、下画像のようにネットワークが用意されており、各種テクスチャを作成するノードが分かれています。
ここでは、RigidタイプのVertex Animation Textureを作成する際に生成されるRotaion Mapの変換を一例としてご紹介します。Rotation Mapを作成しているネットワークは、一番左側に用意されています。

まず初めに、Vertex Animation TextureのX軸方向とY軸方向の解像度を反転させます。
その処理を、Scale COP ノードを使用して行います。ORIENT(Subnetwork)の下に、Scale COP ノードを追加します。

Scale COPノードのパラメータを変更します。
[Scale]パラメータを[To Resolution]に変更し、[Image Size]パラメータの編集モードに切り替えます。パラメータにそれぞれ、
[res(opinputpath("."),0),D_YRES)]、[ res(opinputpath("."),0),D_XRES)]
と入力します。

VOP COP2 Filterノードを作成し、Scale COPノードの出力をinput1へ繋ぎ、ORIENT(Subnetwork)の出力をinput2へ繋ぎます。

VOP COP2 Filterノードの中に入りCOP Input VOPノードを追加します。このノードによって、元のテクスチャ画像のピクセル値を取得します。

また、接続をGlobal Variables VOP ノードの XとYからCOP Input VOPノードのuとvにクロスして接続することで、解像度だけでなく頂点情報とフレーム情報も反転して持たせることができます。

Vector4 to Float VOPノードを接続します。
また、Vector4 to Float VOPノードのアウトプットをOutput VOPノードに接続します。
下画像のように、fval1のR、fval2をG、fval3をB、fval4をAにそれぞれ接続します。
これにより、反転したRGBAのデータを出力します。

現状では、Scale COPノード側のRGBAデータが読み込まれ、float型の出力からvector4型の入力に接続されているので、COP Input VOPノードのパラメータを変更します。

SignatureパラメータでCOP Input VOPノードの出力データタイプをVector4型に変更し、Input Indexパラメータに1を入力することで、参照するデータをVOP COP2 Filterノードのinput2から入力されたものに指定します。

VOP階層からCOP階層に戻り、切り替え用のSwitch COPノードと出力用のNull COPノードを接続します。

ROP階層に戻り、Rotation Mapをレンダリングするrender_orient(Subnetwork)の中に入ります。

今回は、Labs Vertex Animation Textures ROPノードの[BC 4Channel Split]パラメータを変更しないことを想定しているので、render_orient(Composite ROPノード)の設定のみ変更します。

render_orient(Composite ROPノード)の[Composite]タブ内にある[COP Path]パラメータに、先ほどtextures(COP2 Network)の中に作成した[_ORIENT(Null COPノード)]を読み込みます。以上でネットワークのセットアップは完了です。

最後に、通常のVertex Animation Textureと、変換したVertex Animation Textureのどちらを出力するかを切り替えるための[Toggle]パラメータを追加します。
一度、Vertex Animation Texture ROPノードの外に出て、右クリックから[Type Properties]を選択します。

Edit Operator Type Propertiesの[Parameters]タブを開きます。

次に、Create Parametersに用意されているToggleパラメータを、 Existing Parameters の [Settings]フォルダ内にドラッグ&ドロップで配置します。

続いて、Toggleパラメータの名前とラベルを変更します。Parameter Description内で、ここでは[Name]を[convert_map]とし、[Label]を[Convert Map]とします。

設定後、[Apply]ボタンで設定内容を保存し、[Accept]ボタンで適用します。

最後に、作成したパラメータ(Convert Mapパラメータ)を右クリックし、[Copy Parameter]を選択します。これで、このパラメータまでの相対パスを取得することができます。

Labs Vertex Animation Textures ROPノード内に入り、textures(COP2 Network)内のSwitch COPノードのInput Indexパラメータに対して関連付けを行います。
パラメータ上で右クリックし、[Paste Relative References]を選択してパスを入力します。

以上の設定で、パラメータのチェックを外している際は、通常のRotation Mapが出力され、チェックが入っている場合は、変換されたRotation Mapが出力されます。

このような形で、オリジナルの機能を追加する際には設定を行う必要があります。
また、今回はRotation Mapの変換に着目しましたが、他のPosition Mapなどを変換する際も同様に、ノードの追加と対応しているComposite ROPノードを確認し、設定を行う必要があります。詳しくは、サンプルファイルをご覧ください。


Labs Vertex Animtion Textures ROPノード編集後の保存について

HDA作成の際に、Edit Operator Type Propertiesから設定を変更し、保存をする方法がありますが、こちらの方法では既存のHDAを上書き保存してしまうため、リカバリーが効かないというデメリットがあります。

そのため、ここでは、Labs Vertex Animation Textures ROPノードを別名のHDAとして保存する方法をご紹介します。

まず、Labs Vertex Animation Textures ROPノード上で右クリックし、[Versioned Digital Asset]を選択後、[Svae As]を選択します。

次に、HDAを保存した際のファイル名とマイナーバージョン等を決めるメニューが表示されます。

1.Namespace
1番目のタグを決めます。

2.Branch
2番目のタグを決めます。

3.Type and Version
3番目のタグとマイナーバージョンの数字を設定します。

4.Label
Houdini内にHDAが読み込まれた際のノード名を設定します。

5.ファイル名
1.から3.までで設定した文字列をもとに、HDAのファイル名を表示します。
HDAのメジャーバージョンは2.0が基準となっているため、このメニューでは変更することはできませんが、マイナーバージョンは変更することができます。


ここでは、例として、HDAのファイル名を[IZ::vertex_animation_textures::2.1]とし、ノード名を[Custom Vertex Animation Textures]と設定しています。
設定後、[Continue]ボタンを押します。

次に、HDAファイルの出力先を設定します。[Save Path]から[Custom – $HIP]を選択することで、現在開いているhipファイルの保存場所と同じフォルダ内に出力が行われます。
設定後、[Create]ボタンを押します。

フォルダを確認すると、HDAファイルとして出力されていることが確認できます。

HDAを改変する場合は、このように一度別ファイルとして作成を行い、それを読み込んで作業を行うことで、元のLabs Vertex Animation Textures ROPノードを上書きしてしまう可能性を軽減することができます。

UnityへVertex Animation Textureを読み込む際の設定方法や、その他の詳細設定については以上です。

現在のLabs Vertex Animation Textures ROPノードでは、Unrreal Engine 4やUnityへの出力用プリセットは、既に用意されています。
しかし、それ以外のゲームエンジンや、独自で開発したゲームエンジンを使用している場合、各自でプリセットを作成し、適したデータを出力できるように改良する必要が出てくる可能性があります。 そのような場合に、今回ご紹介しました例を一つ、ご参考にしていただければと思います。