Labs Vertex Animation Textures ROPを使用したFlip処理の設定 / メッシュの頂点情報の編集 / バッチファイルの実行方法


こちらの記事では、Vertex Animation Textureに対して、保存情報の変換(Flip処理)を行う方法、メッシュの頂点情報の編集を行う方法、バッチファイルの実行方法について、ご紹介致します。

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

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

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

Labs Vertex Animation Textures ROPノードについて

記事で使用している「Labs Vertex Animation Textures ROPノード」については、こちらの記事をご参照ください。

サンプルファイルについて

記事で使用しているプロジェクトファイル等は、こちらからダウンロードすることができます。
配布している[Sample_Hip]ファイルの中には、Labs Vertex Animation Textures ROPノードのネットワークを編集して、Flip処理を追加したHDAファイル「IZ.Custom_vertex_animation_textures.3.3.hda」を添付しています。
サンプルのHipファイル内で開かれている Vertex Animation Textures ROPノードは、読み込んだHDAファイルです。
Tabメニューから、ROPノードの検索を行った際に、[Custome Vertex Animation Textures]と表示されているノードが該当します。併せてご活用ください。

こちらの記事では、Houdini18.0.592を使用しています。

1.出力画像のFlip処理について

1.1 COPネットワークの設定

ご使用のゲームエンジンによっては、テクスチャを読み込んだ際のUVの向きが異なる場合があります。(x,y)が(u,v)に対応する場合がある一方、(x,y)が(v,u)に対応するパターンがあり、その設定はエンジンによって異なります。
テクスチャに保存される頂点情報とフレーム情報を反転して設定する必要がある場合があります。この反転機能は、Labs Vertex Animation Textures ROPノードでは予め用意されていないので、Labs Vertex Animation Textures ROPノードを編集する必要があります。

頂点情報とフレーム情報の反転については、こちらの記事で記載していますが、本記事ではより詳細にご紹介します。

現時点におけるベータ版のLabs Vertex Animation Textrue ROPノードは、Unreal EngineやUnityで出力データを読み込むことを想定して作成されています。ですので、これらのゲームエンジンで読み込む際は、本記事で紹介する設定は不要です。

また、記事内で掲載しているテクスチャは、以下のアニメーションを出力したものになります。

初めに、Labs Vertex Animation Textures ROPノード上で右クリックから、「Allow Editing of  Contents」を選択し、編集可能な状態にします。

Labs Vertex Animation Textures ROPノード内に入り、更に「textures(COP2 Network)」に入ります。
textures(COP2 Network)内では、出力画像データの元データの編集が行われています。

textures(COP2 Network)に入ると、下画像のようにデフォルトでは、ネットワークが用意されています。赤枠で囲まれたノードはSubnetoworkであり、作成されるPosition MapやRotation Mapなどの9種類の画像データを必要に応じて分けてアウトプットしています。そのため、Flipを行うためには、これらの末端のノードに対して処理を追加する必要があります。

また、これらのマップはSoft、Rigid、Fluid、Spriteのメソッドの違いや、ユーザー側の設定により、出力されるデータが異なります。例えば、Rigidメソッドであればデフォルトでは、Position MapとRotation Mapが出力されます。

Vertex Animation Textureの反転を行う処理の設定方法につきましてご紹介します。
下の画像は、COPネットワークの中でもFlip処理を行っている箇所を拡大したものになります。ここでは、Position Mapとして出力されるデータの反転を行っている箇所を例として示しています。

[flip_x_and_y5(Scale COPノード)]では、X軸とY軸の画像サイズを反転し、 [sample_the_second_input6(VOP COP 2 Filter COPノード)]で頂点情報とフレーム情報の反転を行います。
Switch COPノードは、出力データを切り替えるために用意しています。

こちらの記事の「4.頂点情報とフレーム情報の設定について」という章で、Vertex Animation Textureに保存するデータの反転を行う方法について、紹介しています。併せてご参照ください。

特に、[flip_x_and_y5(Scale COPノード)][sample_the_second_input6(VOP COP 2 Filter COPノード)]の設定が重要となります。
まず、[flip_x_and_y5(Scale COPノード)]からご紹介します。

■flip_x_and_y5(Scale COPノード)について

[Scale]パラメータを[To Resolution]に変更し、[Image Size]パラメータを編集モードに切り替えます。パラメータにそれぞれ、
[res(opinputpath("."),0),D_YRES)]、[ res(opinputpath("."),0),D_XRES)]
と入力します。
これによって、入力データの解像度を反転させます。

ディスプレイフラグをflip_x_and_y5(Scale COPノード)に切り替えると、画像の解像度が反転していることが分かります。ただし、模様が同じ方向に向いています。つまり、保存されているデータ自体は反転されていません。


sample_the_second_input6(VOP COP 2 Filter COPノード)の使用

データを反転するために、[sample_the_second_input6(VOP COP 2 Filter COPノード)]を使用します。下画像は、内部ネットワークです。

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

Vector4 to Float VOPノードを使用して、Vector4型のデータを4つのFloat型の値に分けます。下画像のように、[fval1をR]、[fval2をG]、[fval3をB]、[fval4をA]にそれぞれ接続します。
Vertex Animation Textureでは、法線情報をAlphaに保存するので、RGBのみでは正しいデータを出力することができないため、注意が必要です。

■補足:稀に、Alpha情報が保持されないことがあるので、その場合は[fval1をCr]、[fval2をCg]、[fval3をCb]、[fval4をC4]に接続すると、改善される場合があります。

sample_the_second_input6(VOP COP 2 Filter COPノード)を使用して、変換した結果、下の画像のようになり、頂点情報とフレーム情報が反転します。

ここまではPosition Mapに焦点を当ててご説明しましたが、その他のMapにつきましても同様にネットワークの設定を行うことで、Flip処理を行うことができます。

1.2 画像データのレンダリング設定

出力画像のレンダリングは、textures(COP2 Network)の外部に用意されているレンダリングとスクリプト実行のためのネットワークに組み込まれているSubnetwork(青色のノード)で行われています。

Position Mapの出力の場合、textures(COP2 Network)内でアウトプット用のノードとしてPOSITION(Subnetwork)が用意されています。

POSITION(Subnetwork)render_position(Subnetwork)内にあるComposite ROPノードに読み込むことで、一連の処理の中で自動的にレンダリングが行われるように設定することができます。


■Composite ROPノードのパラメータの設定

Composite ROPノード[COP Path]パラメータでレンダリングする画像データを読み込みます。ここで、先ほどのPOSITION(Subnetwork)を指定します。ここでは、Position Mapの例を示しましたが、他のマップを作成する場合も同様に、textures(COP2 Network)内のアウトプット用のノードに対応するSubnetworkに読み込むことでレンダリングができます。

また、一枚の画像の中に法線情報を含ませたい場合、Composite ROPノード[Plane Scope]パラメータでデータの選択ができます。

補足ですが、上の画像のCOP Pathパラメータを見ると、「../../textures/POSITION/XYZW」と入力されています。デフォルトの場合、厳密にはPOSITION(Subnetwork)の内部にあるXYZW(Null COPノード)を読み込んでいます。


2.出力前のメッシュデータ編集について

2.1 ポイントと頂点の扱い

Vertex Animation Textureでは、指定した範囲のフレームにおける、頂点の情報を保存できます。しかし、出力データの1つであるメッシュデータ(FBX)から頂点座標や頂点インデックスなどの情報を取得したい場合があります。
場合によっては、メッシュデータの持つアトリビュートに対して、処理を加える必要が出てきます。

ここでは、Houdiniにおけるポイントと頂点の違いを交えて、Labs Vertex Animation Textures ROPノード内におけるメッシュデータの扱いについて、ご紹介します。

Houdiniでは、ポイントと頂点は異なる情報として扱われます。
下の画像は、4つの4角形メッシュで構成されたグリッドを表したものです。各メッシュに対して、4角形メッシュであれば4つの頂点、3角形メッシュであれば3つの頂点が存在します。ポイントは、複数の頂点を共有する接続点として扱われます。

また、頂点番号は各メッシュ毎に必ず時計回りに割り振られます。

メッシュの頂点情報を独自で扱う場合、よく間違えるのがポイントIDと頂点IDの扱いになります。ポイントと頂点は別物なので、番号を取得する際にも異なるインデックス変数が必要です。

また、先ほどの4角形メッシュから構成されたグリッドの頂点情報をジオメトリスプレッドシートで確認すると、下の画像のように0:0や0:1と書かれた欄(赤枠)Point Numという欄(青枠)があるかと思います。それぞれ、プリミティブ番号:頂点番号(赤枠)共有するポイントの番号(青枠)を示しています。

Point Numに同じポイント番号が表示されている場合、このポイントは複数の頂点によって共有されていることを意味します。


2.2 メッシュデータの編集

Labs Vertex Animation Textures ROPノードの中で、FBXファイルの出力は[render_mesh_fbx(Filmbox FBX ROPノード)]で行われています。

render_mesh_fbx(Filmbox FBX ROPノード)の[export_node]パラメータを確認すると、
`ifs(ch(“../enable_name”)==1,”/export/”+chs(“../name”),”/export/MESH”)`
と記述されており、出力ノードとして指定されているのは、[export(Object Network)]の中にある[MESH(Geometry Object ノード)]であることが確認できます。

■補足:ifs関数については、こちらをご参照ください。

この場合、特定の出力用ノード(Null SOPノードなど)が指定されていないので、MESH(Geometry Object ノード)内の階層が出力対象となり、ディスプレイフラグがついているノードまでの処理結果がFBXに保存されます。

下画像のgeometry(Object Merge SOPノード)以下の3つのノードは、インデックス変数の確認用の[attribwrangle1]、uvアトリビュートに対して頂点インデックスを乗算したデータをuvアトリビュートに格納する式が記述された[attribwrangle2]、不要なアトリビュートを削除する[attribdelete1]を接続しています。

順を追って確認します。
下の画像は[attribwrangle1]の記述内容と、Geometry Spreadsheetです。
頂点の番号を取得するためには@vtxnum、一つのポリゴンにおける頂点の総数を取得するためには@numvtxを使用することになります。

それぞれ、@my_vertex_num@num_my_vertexとして作成し、求めている数値が得られているか確認を行っています。ここでは[attribwrangle1]はアトリビュートの確認のため用意しています。

下の画像は、[attribwrangle2]の記述内容です。目的によって式は異なりますが、ここでは頂点の総数倍し、uv2.xに再び格納する操作を行っています。

最後に、[attribdelete1]で不要な@my_vertex_numと@num_my_vertexを削除します。

このように、頂点シェーダで特定のuvアトリビュートをインデックスとして扱うことを目的とし、メッシュデータのアトリビュートを編集するネットワークをLabs Vertex Animation Textures ROPノードに組み込みたい場合は、export(Object Network)の中にあるMESH(Geometry Object ノード)内のgeometry(Object Merge SOPノード)以下に処理を追加すると分かりやすいかと思います。

3.バッチファイルの実行について

Labs Vertex Animation Textures ROPノードを使用して、バッチファイルの作成を行う場合、[Script]タブから設定を行うことができます。
Scriptタブは、User InterfaceモードがNormalに設定されている場合のみ、操作ができます。

User InterfaceモードをNormalに設定した状態で、Labs Vertex Animation Textures ROPノードのパラメータの下部に移動すると、Scriptタブが表示され、
中にレンダリング処理が行われる前に実行される処理を記述する[Pre-Render]パラメータと、
レンダリング処理が行われた後に実行される処理を記述する[Post-Render]パラメータが用意されています。

[Pre-Render]パラメータと[Post-Render]パラメータからの入力は、pre_render_script(Shell ROPノード)post_render_script(Shell ROPノード)に渡されます。

Labs Vertex Animation Textures ROPノードの[Post-Render]パラメータは、デフォルトでは、post_render_script(Shell ROPノード)の[Pre-Render Script]パラメータに関連付けられています。

出力後のデータに対して、ゲームエンジンに適した専用データに変換する後処理をLabs Vertex Animation Textures ROPノード内の機能を使用して行う場合、[Post-Render]パラメータをpost_render_script(Shell ROPノード)の[Post-Render Script]パラメータに関連付ける必要があります。
これにより、スクリプトが一連のレンダリング処理後に実行されるようになります。

Labs Vertex Animation Textures ROPノードのScriptタブ内で使用できるスクリプトは、PythonもしくはHscriptになります。
Pythonを使用する場合、Post-Renderパラメータ内に直接コードを入力することもできますが、外部ファイルを作成した上で読み込むための関数を使用した方が分かりやすいと思います。

Houdini18.0までのバージョンでは、Python2を使用することができます。
Python2では、「execfile(‘filepath’)」を使用し、スクリプトが記述された外部ファイルを読み込むことが可能です。
Python2.7.18までを使用する際は、こちらの記述になります。

Houdini18.5からは、Python3が使用できるようになりました。
Python3では、execfile関数が削除されました。
そのため代わりとして、「exec(open(‘filepath’).read())」を使用する形になります。

また、batファイルの実行を行う場合の記述例は以下のとおりです。
—————————————————————————————————————————
import subprocess
subprocess.call([‘C:\Users\XXX\Desktop\mybatfile.bat’])
—————————————————————————————————————————

今回、ご紹介する内容は以上です。

本記事では、ご使用のゲームエンジンに合わせたデータ出力を行うための設定方法に焦点を当てています。少し細かな説明となりましたが、ご参考にしていただければと思います。また、Unreal EngineUnityへの出力データの読み込み方等もご紹介しておりますので、併せてご確認ください。