Houdini to Unity備忘録


法線

primitiveとvertex(or point)の法線は独立しているので、normalノードで法線を反転させてもUnityに持って行っても面の表裏は反転せずにシェーディングに法線反転した法線が反映されるだけ。
Reverseノードで面の表裏を反転させられる。(pointやvertexではなくてprimitiveの法線を反転させられる。)
Houdini上でもvertexやpointの法線を整えたはずなのにシーンでの見え方がおかしい感じがする時もprimitiveの向きがおかしいのが原因だったりするのでReverseしておけばOK。

Material

1メッシュ内に複数のマテリアルを含んだ状態でモデルを出力したい場合はSOP内(geometryノード内)でmaterialノードをサブメッシュ毎に繋いでMaterialパラメータでそれぞれ適当にマテリアルを設定しておけば出力時にサブメッシュで分割される。
マテリアル自体は/mat/の位置にPrincipleShaderノードを置いておけばそれが前述のMaterialパラメータで選択出来る。

Tangent

Unityに持っていくと「このモデルはTangentとBinormalが無いよー」って警告が出る時がある。polyFrameノードでTangetは生成できるけどpointにTangent持たせても、vertexにTangent持たせても警告が出てくる。UnityのImportSettingsでimportやめて計算させて解決が無難そう。ようわからん。

頂点数

HoudiniでのVertexがFBXのVertexになる。PointはあくまでもHoudini内での概念。なので、出力したFBXをUnityのプロジェクトビューで選択してInspectorを見ると頂点数はPointの数ではなくてVertexの数と一致する。

Houdiniから出力したFBXのメッシュをParticle Systemの発火点に使う場合(Shapeモジュールでメッシュを指定して頂点の位置にパーティクルが出てくる状態)、一か所に4つパーティクルが重なったりすることがある。これは同じ位置の頂点が1つにまとめられていないから。Import SettingsでOptimize Meshをオフにすると、頂点が一つにまとめられている挙動をする。(パーティクル重ならない。)
ただ、Optimize Meshも含めImport Settingsをどう弄ってもInspectorで表示される頂点数は変化しない。パーティクルの挙動が変わるだけなので注意。

結論、多分、HoudiniのPointをFBXの頂点として考えたい時は、Optimize Meshはオフにすれば良い。

出力するFBXの階層

/Obj/直下のGeometryノード一つをFBXとして出力する場合は1メッシュのまとめられて出力される。複数のGeometryノードをSubnetにまとめれば、階層化されて2メッシュが含まれてFBXを書き出せる。GeometryノードのTransformを弄ればPivotやRotationの値も任意に設定できる。(HoudiniとUnityの右手/左手座標系の違いから値の符号が反転していることはある。)
ただ、ワークフローとしては1つのGeometryノード内で階層を指定したい。Houdini 18.0.499からprimitiveにpathアトリビュートを持たせるとROPでFBXを出力する際に階層化される機能がある。この場合各階層のPivotやRotationの値はすべて0になるので細かい要求が満たせない。残念。
(なのでその辺も指定出来てワークフロー的にも無理過ぎないノードを作り途中。)

アドベントカレンダーを機に、一つのGeometryを階層で分けたFBXで出力する為のノード群を開発しました。【Houdini】1ジオメトリーから階層付きFBXを出力するツールの開発
ただし、どんなアプローチをとっても満足なツールにはならなそうなので、多少スマートじゃないものになった...。
Unityに持っていくとスケールが1/100になる仕様のギャップも吸収するように作ってあります。

FBX出力設定

ASCII Formatで出力するとデータサイズが大きくなるので、理由がない限りチェックを外すと良い。

頂点カラー

vertexのCdアトリビュートが頂点カラーとして出力される。Alphaアトリビュートが頂点カラーのアルファになる。
頂点カラーにprimitivの中心座標とか、色ではなく座標をいれてUnityでシェーダーでデコードする場合はHoudiniとUnityの座標系の違いを考慮して、x軸の値(color.r)を反転(r = 1-r;)する必要がある。

Self-intersecting

モデルとか状況次第で変わる話だろうけど、出力したFBXをunityでインポートした時に、「self-intersectingしてるからdiscardしたよ」みたいな警告が出ることがある。poly doctor SOPやclean SOPで重複プリミティブやゴミ頂点の削除ができるのでまずそれを試す。
poly doctor SOPは5角形以上のポリゴンに対しての処理があったりして、poly doctorを使うだけだと、寧ろ意図していない形のプリミティブが生成されてしまったりする場合があるので、divide SOPで三角化しておいてからpoly doctorに通すと崩れずに解決できる。