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 の 1 は 1 メートル
Houdini のシーン単位は、既定で 1 単位=1 メートルです。設定は Edit > Preferences > Hip File Options の Unit Length にあります(22.0 の環境設定ドキュメントでは General の Units に載っています)。受け取る側の単位と上方向は次のとおりです。
| ツール | 長さの単位 | 上方向 |
|---|---|---|
| Houdini | m(既定) | Y-up |
| FBX(形式としての基準) | cm | ファイルに軸の情報を持つ |
| Unreal Engine | cm | Z-up |
| Unity | m | Y-up |
| Maya | cm(既定) | Y-up(既定) |
Houdini と Unreal Engine では、同じ数値でも大きさが 100 倍違います。どこで換算するかを先に決めておきます。
軸:Houdini は Y-up の右手系
Houdini は Y 軸が上の右手系で、Unreal Engine は Z-up です。FBX はファイルに軸の情報を持っていて、多くの場合はエンジンの取り込み処理がそれを読んで変換します。どちらの側で変換するかを、チームで1つに決めておきます。





メートルとセンチと、Y-up と Z-up と……むずかしいねぇ。でも「どこで変換するか」を1か所に決めちゃえば、あとは迷わないんだぁ。
FBX を書き出す3つの方法
ひとことで:ゲームアセットには、SOP の最後に置く ROP FBX Output が扱いやすいです。
| 方法 | 場所 | 向いている用途 |
|---|---|---|
| File > Export > Filmbox FBX | メインメニュー | シーンや一部のネットワークを一度だけ書き出す |
| Filmbox FBX | ROP ネットワーク(/out など) | 階層・カメラ・アニメーションを含めてシーンを書き出す |
| ROP FBX Output | SOP ネットワーク | 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 をオン |
| UV | uv 属性(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 での扱い | 注意点 |
|---|---|---|
N | normals | ― |
uv | primvars:st に変換できる | Translate UV Attribute to ST をオンにしたときだけ変換される |
Cd | primvars: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 の箱のテスト用ファイルで、大きさ・向き・陰影を確かめた
次に読む記事
- FBX/glTF/USD/Alembic|3Dデータ形式の使い分け早見表:形式の選び方
- Houdini Solaris入門:LOP ネットワークで USD のシーンを組み立てる
- USD入門|ゲームスタジオで何が変わるか・段階移行と現状:USD をパイプラインに入れる考え方
- MayaのFBXエクスポートと座標系トラブル:Maya 側から見た FBX の単位と軸
- Substance 3D PainterのHigh to Lowベイク実務:書き出したメッシュを名前で対応させてベイクする



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




