HoudiniでFBX/USDを書き出す|単位・軸・法線をそろえてエンジンへ

HoudiniでFBX/USDを書き出す|単位・軸・法線をそろえてエンジンへ

Houdini で作ったモデルや地形をゲームエンジン、Substance 3D Painter、Maya に渡すとき、入口になるのが FBX と USD の書き出しです。書き出し自体はノードを1つ置くだけですが、単位・軸・法線・マテリアルの扱いを決めずに出すと、「大きさが 100 倍ずれる」「横に寝ている」「角が丸く見える」といった事故が起きます。

本記事では、Houdini から FBX と USD を書き出す手順と、受け取る側(主にゲームエンジン)で確認する設定を整理します。形式ごとの特徴や選び方は FBX/glTF/USD/Alembic|3Dデータ形式の使い分け早見表 で扱っているので、本記事は Houdini からの書き出しに絞ります。

対象は執筆時点(2026年9月)の最新版である Houdini 22.0 です。ノード名とパラメーター名は SideFX の公式ドキュメント(22.0)に合わせています。21.0 以前とは環境設定の場所などが異なる箇所があり、バージョンによって表記が異なります。

夕宮たいだ

ふぁ……みんな〜、今日は Houdini から外に出すおはなしだよぉ。出すのは一瞬なんだけど、出したあとの「あれ?」が多いんだぁ。順番に潰していこ〜。

目次

書き出す前に決める3つのこと

ひとことで:形式・単位・上方向の軸を、受け取る側に合わせて先に決めます。

形式:アセットは FBX、シーンは USD

ゲームエンジンへのメッシュの受け渡しや、Painter・Maya へのアセットの受け渡しは FBX が第一候補です。複数のアセットを並べたシーンを構造ごと渡したい場合や、パイプラインを USD で組んでいる場合は USD を使います。

Houdini から FBX と USD を書き出す3つの経路
図1:アセットは FBX、シーンは USD で渡す

単位:Houdini の 1 は 1 メートル

Houdini のシーン単位は、既定で 1 単位=1 メートルです。設定は Edit > Preferences > Hip File Options の Unit Length にあります(22.0 の環境設定ドキュメントでは General の Units に載っています)。受け取る側の単位と上方向は次のとおりです。

ツール長さの単位上方向
Houdinim(既定)Y-up
FBX(形式としての基準)cmファイルに軸の情報を持つ
Unreal EnginecmZ-up
UnitymY-up
Mayacm(既定)Y-up(既定)

Houdini と Unreal Engine では、同じ数値でも大きさが 100 倍違います。どこで換算するかを先に決めておきます。

軸:Houdini は Y-up の右手系

Houdini は Y 軸が上の右手系で、Unreal Engine は Z-up です。FBX はファイルに軸の情報を持っていて、多くの場合はエンジンの取り込み処理がそれを読んで変換します。どちらの側で変換するかを、チームで1つに決めておきます。

Houdini・FBX・Unreal Engine・Unity の単位と上方向の対応
図2:単位と軸は「どこで変換するか」を1か所に決める
夕宮たいだ

メートルとセンチと、Y-up と Z-up と……むずかしいねぇ。でも「どこで変換するか」を1か所に決めちゃえば、あとは迷わないんだぁ。

FBX を書き出す3つの方法

ひとことで:ゲームアセットには、SOP の最後に置く ROP FBX Output が扱いやすいです。

方法場所向いている用途
File > Export > Filmbox FBXメインメニューシーンや一部のネットワークを一度だけ書き出す
Filmbox FBXROP ネットワーク(/out など)階層・カメラ・アニメーションを含めてシーンを書き出す
ROP FBX OutputSOP ネットワーク1つのジオメトリを、作業の最後で繰り返し書き出す

SOP の ROP FBX Output(内部名 rop_fbx)は、公式ドキュメントでは Filmbox FBX ROP output driver という名前で載っていて、パラメーターの説明は ROP の Filmbox FBX のページにまとめられています。

ROP FBX Output で書き出す手順

1. 書き出したいジオメトリを作っている SOP ネットワークで、TAB メニューから ROP FBX Output を追加し、最後のノードの出力につなぎます。

2. Output File に保存先を指定します。例:$HIP/export/SM_Rock_01.fbx($HIP は .hip ファイルがあるフォルダ)。ファイル名は アセット命名・バージョン規則|チームで事故らないルール作り のようにチームの規則にそろえます。

3. Convert Units をオンにし、Axis System は既定の Y Up (Right-handed) のままにします(理由は次の節で説明します)。

4. Save to Disk を押すと書き出されます。

単位と軸をそろえる

ひとことで:Convert Units をオンにして cm で書き出し、軸の変換はエンジンの取り込み設定に任せるのが基本です。

Convert Units:メートルを FBX の cm に換算する

Convert Units をオンにすると、Houdini の単位(Unit Length、既定はメートル)を、FBX 本来の単位であるセンチメートルに換算して書き出します。Unreal Engine は cm なのでそのままの大きさで入ります。Unity は、Model タブの Convert Units がオンであれば、ファイルの単位を Unity の単位(m)に換算して取り込みます。

Axis System:上方向の約束を選ぶ

Axis System の選択肢は、Y Up (Right-handed)(既定)、Y Up (Left-handed)、Z Up (Right-handed)、Current (Y Up or Z Up Right-handed) の4つです。これはファイルに記録する軸の約束を選ぶ設定で、シーンの向きをその軸へ実際に変換するのは、Convert to Specified Axis System をオンにしたときです。

エンジンは FBX に記録された軸の情報を読んで変換するので、基本は既定のまま書き出します。チームで Z-up のファイルにそろえる決まりがある場合だけ、Z Up (Right-handed) と Convert to Specified Axis System をセットで使います。

1 m の箱で確かめる

設定を決めたら、Box SOP で 1 m 四方の箱を作って同じ設定で書き出し、エンジン側で 100 cm(Unity なら 1 m)になっているか、上の面が上を向いているかを確かめます。この箱のファイルはチームの設定と一緒に残しておきます。

夕宮たいだ

単位を確かめないまま本番のアセットを出すの、絶対ダメだよ! 100 倍ずれてから気づくと、置き直しがほんとに大変なんだぁ。

法線・UV・マテリアル・名前を整える

ひとことで:FBX に入るのは属性として持っている情報だけなので、書き出す前に属性をそろえます。

公式ドキュメントの対応表では、FBX で運べるのは法線・UV・頂点カラー・ユーザー定義の属性と、オブジェクト単位・ポリゴン単位のマテリアルの割り当てです。

運びたい情報Houdini 側で用意するもの書き出し時の設定
法線(角の立ち方)N 属性(Normal SOP で頂点に作る)Compute Smoothing Groups をオン
UVuv 属性(2つ目は uv2 など)2つ目の UV はエンジン側で本数を確認
頂点カラーCd 属性―
マテリアルの区切りshop_materialpath 属性(Material SOP で割り当て)―
メッシュの分け方と名前path などの文字列の属性Build Hierarchy from Path Attribute をオン

法線:Normal SOP で角を決める

エンジンでの陰影は法線で決まります。Normal SOP の Add Normals to を Vertices にし、Cusp Angle(この角度より大きく折れている辺を硬い辺として分ける値)で、角を立てる辺を決めます。ROP FBX Output の Compute Smoothing Groups をオンにすると、この頂点法線から FBX のスムージンググループも計算して書き出します。法線の理屈は ノーマルマップとタンジェント空間|DCCとエンジンで一致させる で扱っています。

マテリアル:区切りと名前を渡す

Material SOP で面ごとにマテリアルを割り当てると、shop_materialpath 属性にマテリアルのパスが入り、FBX ではポリゴン単位のマテリアルとして、エンジン側ではマテリアルの区切り(スロット)として扱われます。シェーダーの中身はエンジンで再現されないので、FBX で運ぶのは「どの面にどのマテリアルか」と名前だけと考え、マテリアル本体はエンジン側で作ります。

名前と分け方:path 属性でメッシュを分ける

1つの SOP から複数のメッシュに分けて書き出すときは、Build Hierarchy from Path Attribute をオンにし、Path Attribute に文字列の属性(例:path)を指定します。値がそのまま FBX 内のノード名と階層になり、rock/body と rock/moss なら rock の下に2つのメッシュができます。Painter でハイポリとローポリを名前で対応させてベイクする場合も(Substance 3D PainterのHigh to Lowベイク実務 を参照)、_low・_high の命名をこの段階でそろえておけば、書き出し後に手で直さずに済みます。

夕宮たいだ

ほえ〜、path 属性に書いた名前が、そのまま FBX の中のメッシュ名になるんだぁ。命名を Houdini の中で決めきれるの、うれしいねぇ。

そのほかの FBX の設定

  • FBX SDK Version:書き出す FBX のバージョン。受け取る側に合わせ、プロジェクトで1つに固定します。
  • Export in ASCII:オンにするとテキスト形式になり、中身をテキストエディタで確認できます。普段はオフ(バイナリ)です。
  • 原点:SOP で書き出したメッシュは、Houdini の原点(0, 0, 0)がエンジン側の基準点(ピボット)になります。置き場所は原点を基準に整えてから書き出します。

USD を書き出す

ひとことで:SOP の USD File Export で1つのファイルに書き出すのが最短で、属性は USD の名前に変換されます。

USD File Export で書き出す手順

SOP ネットワークから直接 USD を書き出すには、USD File Export(内部名 usdexport)を使います。

1. SOP ネットワークの最後に USD File Export を追加してつなぎます。

2. Output File に保存先を指定します。拡張子を .usda にするとテキスト形式、.usdc にするとバイナリ形式になり、中身を確認したいときは .usda が便利です。

3. Import Path Prefix(既定は /$OS=このノードの名前)に、アセットのルートにするパス(例:/SM_Rock_01)を入れます。

4. Default Primitive にルートの名前(例:SM_Rock_01)を入れます。ほかのファイルからこの USD を参照するときの目印になります。

5. Save to Disk を押します。

path や name 属性に body のような相対的な名前を入れておくと、/SM_Rock_01/body のようにルートの下に並びます。どちらの属性も無い場合、ポリゴンはすべて mesh_0 という1つのメッシュにまとめられます。

属性は USD の名前に変換される

SOP の属性は、書き出すときに USD の決まった名前へ変換されます(公式ドキュメント「Importing SOP geometry into USD」より)。

Houdini の属性USD での扱い注意点
Nnormals―
uvprimvars:st に変換できるTranslate UV Attribute to ST をオンにしたときだけ変換される
Cdprimvars:displayColor―
path・nameプリミティブのパス(階層)どちらも無いと mesh_0 にまとまる
shop_materialpath面の区切り(GeomSubset)Subset Attributes に指定したとき

UV の名前は、受け取る側が st を前提にしているかで決めます(公式ドキュメントでは、Karma でレンダリングするならオフのままと案内されています)。マテリアルの割り当てまで USD で作る場合は、Solaris の SOP Import の Bind Materials と usdmaterialpath 属性を使います。

Solaris から書き出す場合

複数のアセットを並べたシーンや、マテリアル・ライトを含めて USD を組み立てるときは、Solaris(LOP ネットワーク)を使います。SOP Import でジオメトリを取り込み、最後に USD ROP を置いて Save to Disk で書き出す流れです。LOP ネットワークの組み方は Houdini Solaris入門 で解説しています。

単位と軸はメタデータで持つ

USD はファイルごとに、1 単位が何メートルか(metersPerUnit)と上方向の軸(upAxis)をメタデータとして持ちます。USD File Export や USD ROP の Ensure Basic Metrics are Set on All Layers をオンにすると、この2つが必ず書き込まれます。metersPerUnit は既定で Unit Length(通常は 1 m)に従います。エンジンの USD への対応は FBX ほどそろっていないので、これらのメタデータと UV の名前(st か uv か)が読まれるかを、テスト用のアセットで確かめてから本番のデータを流します。

夕宮たいだ

ていねいに整理するねぇ。USD は「uv が st になっているか」「単位がメタデータで入っているか」の2つを最初に見るといいんだぁ。

エンジン側の取り込みで確認すること

ひとことで:大きさ・向き・陰影・マテリアルの区切りの4点を、取り込み設定と実物の両方で確かめます。

Unreal Engine(FBX)

Unreal Engine の公式リファレンス「FBX Import Options Reference」(5.8)の主な項目です。取り込みの仕組みやバージョンで画面の構成が変わるので、名前は目安にしてください。

  • Convert Scene:FBX の座標系を Unreal Engine の座標系に変換する
  • Convert Scene Unit:FBX の単位を Unreal Engine の単位(cm)に換算する
  • Normal Import Method:Compute Normals(エンジンで計算)、Import Normals(法線はファイルから読む)、Import Normals and Tangents(法線とタンジェントをファイルから読む)

Houdini で法線を作り込んだ場合は、Import Normals か Import Normals and Tangents を選びます。Compute Normals のままだと、Houdini で決めた角の立ち方がエンジンの計算で置き換わります。

Unity(FBX)

Unity では、Import Settings の Model タブで設定します(項目名は Unity 6.6 のマニュアルに合わせています)。

  • Convert Units:ファイルに記録された単位を Unity の単位に換算する
  • Bake Axis Conversion:軸の変換結果を、頂点やアニメーションのデータに焼き込む
  • Normals:Import(ファイルから読む。既定)、Calculate(Unity で計算)、None
  • Tangents:Import や Calculate Mikktspace など、タンジェントの扱いを選ぶ
夕宮たいだ

ぁぅ……エンジンの取り込み画面って、バージョンが上がるたびに項目が動くんだよねぇ。決めた設定は、チームの手順書に書いて残しておいてねぇ。

よくある失敗と対処

ひとことで:大きさ・向き・陰影・マテリアル・メッシュの分かれ方のどれがずれたかで、原因の場所を切り分けます。

大きさが 100 倍(または 1/100)になる

Houdini の Convert Units と、エンジン側の単位の換算(Unreal Engine の Convert Scene Unit、Unity の Convert Units)の組み合わせがずれています。どちらで換算するかを1か所に決め、1 m の箱で確かめます。

横に寝ている・向きが逆になる

軸の変換が二重にかかっているか、どこでもかかっていません。Houdini 側は Axis System を既定の Y Up (Right-handed) にして、エンジン側の変換(Unreal Engine の Convert Scene など)に任せる形にそろえます。

角が丸い・陰影がガタガタになる

  • 法線(N)を頂点に持たせていない、または Cusp Angle が合っていない
  • エンジン側で法線を計算し直している(Unreal Engine の Compute Normals、Unity の Normals の Calculate)
  • 取り込み側がスムージンググループを参照しているのに、Compute Smoothing Groups がオフになっている

マテリアルが1つにまとまる・メッシュが分かれない

shop_materialpath や path 属性が SOP の途中で消えていないか、ROP FBX Output の直前のノードを選んで Geometry Spreadsheet(ジオメトリの属性一覧)のプリミティブの項目で確認します。メッシュが分かれない場合は、Build Hierarchy from Path Attribute と Path Attribute の属性名も見直します。

テクスチャが一緒に来ない

公式ドキュメントによると、FBX の書き出しがテクスチャを含めるのは、ビューポートに表示されているものだけです。ゲーム向けにはテクスチャを Painter などから別に書き出し、エンジン側でマテリアルを組むのが確実です。

チェックリスト

  • [ ] 受け取る側の単位と上方向を確認し、変換する場所を1か所に決めた
  • [ ] Convert Units・Axis System・Convert to Specified Axis System の設定をチームでそろえた
  • [ ] Normal SOP で頂点法線を作り、Compute Smoothing Groups をオンにした
  • [ ] uv・shop_materialpath・path の属性が、書き出す直前まで残っている
  • [ ] FBX SDK Version をプロジェクトで1つに固定した
  • [ ] USD の Import Path Prefix と Default Primitive を設定した
  • [ ] 1 m の箱のテスト用ファイルで、大きさ・向き・陰影を確かめた

次に読む記事

夕宮たいだ

ふぁ……これで Houdini から外に出す準備はばっちり……かなぁ。最初の1回だけ 1 m の箱で確かめておけば、あとは安心して出せるよぉ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次