MayaのFBXエクスポートと座標系トラブル|単位・軸・法線の対処

MayaのFBXエクスポートと座標系トラブル|単位・軸・法線の対処

Maya で作ったモデルを FBX に書き出してゲームエンジンに入れると、「100 倍の大きさになった」「横に寝ている」「原点がずれている」「陰影が変わった」といったトラブルが起きがちです。これらの多くは、書き出し前の下準備と FBX の書き出しオプションで防げます。本記事では、その下準備とオプションの決め方、エンジンでのトラブルの切り分け方を、Maya の手順に沿ってまとめます。形式そのものの選び方は「FBX/glTF/USD/Alembic|3Dデータ形式の使い分け早見表」、Maya と Painter の役割分担は「ベイク全体論|MayaとPainterの責任分界とエラー対処」で解説しています。

本記事の内容は、Autodesk Maya 2027(執筆時点の最新アップデートは 2027.2)の公式ヘルプで確認しています。メニュー名は英語 UI で書き、主な項目には日本語 UI の名称を括弧で添えます。エンジン側の項目名は、Unity 6 と Unreal Engine 5.8 の公式ドキュメントで確認しました。いずれもバージョンによって表記が異なります。

夕宮たいだ

ふぁ……みんな〜、今日は FBX 書き出しの話だよぉ。エンジンに入れたら巨大化してた、ってやつ、一度は通る道なんだぁ。原因をひとつずつ潰していこ〜。

目次

書き出す前にMayaで整えること

ひとことで:ヒストリを消し、トランスフォームをフリーズし、原点とピボットをそろえてから書き出します。

まず、書き出すメッシュを整えます。スキンのない静的なメッシュなら、次の順番が基本です。

  • ① Edit > Delete by Type > History(編集 > 種類ごとに削除 > ヒストリ):モデリング操作の履歴を消して、今の形で確定させます。スキンやブレンドシェイプを使っている場合は、変形を残せる Non-Deformer History(デフォーマ以外のヒストリ)を使います
  • ② Modify > Freeze Transformations(修正 > トランスフォームのフリーズ):今の位置・回転・スケールを新しいゼロの状態にします。移動と回転が 0、スケールが 1 になります
  • ③ Modify > Zero Pivot(修正 > ピボットをゼロに設定):ピボットをオブジェクトの原点に戻します

エンジン側では、多くの場合、フリーズした時点の Maya のワールド原点(0, 0, 0)がそのアセットの原点になります。キャラクターなら足元の中心、小物なら底面の中心など、エンジンで基準にしたい点をワールド原点に合わせてからフリーズすると、配置や回転の基準がずれません。

Freeze Transformations のオプション(公式ヘルプ「トランスフォームのリセット/フリーズ オプション」)には、法線に関わる項目が2つあります。Preserve normals(法線の保持)は、スケールがマイナスのオブジェクトをフリーズしても法線が裏返らないようにする設定で、既定でオンです。Lock normals(法線のロック)は、フリーズと同時に法線をロックするかどうかの設定で、ロックされた法線はソフト/ハードエッジの操作で変わらなくなります(「Mayaのスムージングと頂点法線」参照)。左右対称のパーツは Mesh > Mirror(メッシュ > ミラー)で作ると、マイナスのスケールが残りません。

最後に、Smooth Mesh Preview(3 キーの表示)を 1 キーでオフにします。細分化されたメッシュが書き出されるのを防ぐためで、公式ヘルプでも、元のメッシュを書き出すにはプレビューをオフにするよう案内されています。オブジェクト名もエンジンのアセット名やベイクの対応付けに使われるので整えておきます(「Mayaのシーン保存と命名規則」参照)。

FBX 書き出し前の下準備の流れ
図1:書き出し前は、ヒストリ削除から命名までを順に整える
夕宮たいだ

ほえ〜、フリーズって、マイナスのスケールでも法線を守ってくれるんだぁ。オプションは一回のぞいておこうねぇ。

FBX書き出しの手順とプリセット

ひとことで:Export Selection のオプションで FBX export を選び、決めた設定はプリセットとして保存して共有します。

  • ① 書き出すオブジェクトを選び、File > Export Selection(ファイル > 選択項目を書き出し) のオプションボックスを開きます
  • ② File type(ファイル タイプ)で FBX export を選ぶと、FBX 用のオプションが表示されます
  • ③ Presets(プリセット)で基準にするプリセットを選びます。既定は Autodesk Media & Entertainment です
  • ④ Include(含める)と Advanced Options(詳細オプション)を、次の節以降の方針で設定して書き出します

FBX プラグインは、プリセットから変えた設定を「User defined」として保存し、次に使うときの既定にします。前回の設定が残ったまま書き出す事故が起きやすいので、チームで使う設定は Edit Preset ボタンから Save preset でカスタムプリセットとして保存し、そのファイル(拡張子 .fbxexportpreset)を共有します。

同じアセットを何度も書き出すなら、File > Game Exporter(ファイル > ゲーム エクスポータ) も便利です。ゲーム向けのオプションだけを並べたウィンドウで、設定はシーンに自動で保存されます。書き出し時に原点へ移動する Move to Origin もあり、Embed Media は既定でオンです(公式ヘルプ「ゲーム エクスポータ(Game Exporter)」)。

夕宮たいだ

プリセットにしてチームで配れば、毎回チェックボックスを見比べなくていいんだぁ。便利でしょ?

Geometryオプションの決め方

ひとことで:スムージング グループはオン、三角化とタンジェントはベイクとエンジンの運用に合わせて決めます。

Include > Geometry(含める > ジオメトリ)の主な項目は次のとおりです(詳しい説明は公式ヘルプ「FBX 書き出しオプション」)。

項目役割決め方
Smoothing Groups(スムージング グループ)ソフト/ハードエッジの情報をスムージング グループに変換して書き出すオン
Split per-vertex Normals(頂点単位の法線の分割)エッジの連続性にもとづいて頂点法線を分割する古い MotionBuilder 向けの項目。通常はオフ
Tangents and Binormals(接線と従法線)UV と法線からタンジェントと従法線を計算して書き出すエンジンでタンジェントを読み込む運用ならオン(三角化とセット)
Smooth Mesh(スムーズ メッシュ)Smooth Mesh Preview の細分化の扱い書き出し前にプレビューをオフにしておく
Triangulate(三角化)書き出すポリゴンを三角形に分割するベイクとエンジンで分割をそろえる方針で決める

Smoothing Groups

Smoothing Groups がオフでも法線の値は書き出されますが、エッジの情報が含まれないため、エンジン側で法線を計算し直すと Maya と同じ陰影にならないことがあります。Unreal Engine では、スムージング グループのない FBX を読み込むと「No smoothing group information was found in this FBX scene」という警告が出ます(Epic の「Unreal Engine での FBX インポート エラー」)。

Triangulateと三角化の方針

四角形や多角形の面はどこかで必ず三角形に分割されますが、分割のしかたはツールごとに違います。Adobe の「ベイク前の三角形化」でも、ノーマルマップを焼いたときと表示するときで三角形分割が違うと、黒い破綻が出ると説明されています。そこで、次のどちらかをチームで決めて統一します。

  • 三角化してから焼く:Mesh > Triangulate(メッシュ > 三角化)で三角化したローポリを、ベイクにもエンジンにも使います。分割が固定されるので最も確実です
  • 四角形のまま渡す:ベイカーとエンジンがそれぞれ三角化します。修正はしやすい反面、焼いた結果とエンジン上の分割が一致しているかを、エンジンに入れた状態で必ず確認します

Maya が面をどう三角形に分けているかは、Display > Polygons > Face Triangles(フェース三角形)で表示できます。

四角形の三角形分割がベイク時と表示時で食い違う例
図2:ベイク時と表示時で三角形の分け方が違うと、ノーマルマップに破綻が出る

Tangents and Binormals

このオプションは UV のないメッシュでは働かず、公式ヘルプの「FBX の制限事項」には、三角形だけでできたメッシュでないと機能しないと記載されています。オンにするなら三角化とセットで使います。

大切なのは、ベイカーとエンジンが同じタンジェントを使うことです。Substance 3D Painter はタンジェントを常に MikkTSpace という方式で計算するので、エンジン側も MikkTSpace で計算する設定(Unity の Tangents の Calculate Mikktspace、Unreal Engine の Use MikkTSpace)にそろえると、同じメッシュから同じタンジェントが得られます。FBX のタンジェントを読み込む設定(Unity の Tangents の Import など)にする場合は、それがベイク時のタンジェントとそろっているかを確認します。

夕宮たいだ

タンジェントは書き出すの? 書き出さないの?……むずかしいねぇ。「ベイカーとエンジンで同じ計算にそろえる」、ここだけ押さえれば迷わないよぉ。

単位とアップ軸

ひとことで:単位の変換は書き出しか読み込みの片方で1回だけ行い、アップ軸は通常 Y のまま書き出します。

単位(Units)

Maya の作業単位は、Windows > Settings/Preferences > Preferences(ウィンドウ > 設定/プリファレンス > プリファレンス)の Settings(設定)にある Working Units(作業単位)の Linear(リニア)で確認できます。既定はセンチメートルです。

FBX 書き出しの Advanced Options > Units(詳細オプション > 単位)は、既定の Automatic(自動)では Maya の単位のまま書き出し、Scale Factor(スケール係数)は 1.0 で、変換はかかりません。Automatic をオフにすると、File units converted to(変換先のファイル単位)で書き出す単位を指定できます。

エンジン側の単位は、Unreal Engine が 1 単位=1cm で、Maya の既定と同じです。Unity は、物理とライティングが 1 単位=1m を前提にしていると公式ドキュメントで説明されており、インポート設定の Convert Units(ファイルの単位を Unity の単位に変換)や Scale Factor で合わせます。

変換を書き出し側と読み込み側の両方でかけると、100 倍や 100 分の 1 のずれが起きます(どちらでも変換しない場合も同じです)。どちらで変換するかをチームで決め、もう一方は変換しない設定にします。

夕宮たいだ

変換の二重がけ、絶対ダメだよ! 100 倍とか 100 分の 1 とか、すぐ事故になるんだぁ。

アップ軸(Axis Conversion)

Advanced Options > Axis Conversion(軸変換)の Up Axis は Y と Z から選べ、既定では Maya のアップ軸(Y)のまま書き出されます。公式ヘルプでは、Z に変えるのは書き出し先が Y アップを扱えず、変換もできない場合と説明されています。Unity は Maya と同じ Y アップ、Unreal Engine は Z アップですが、どちらも FBX の軸を読み込み時に変換する仕組みを持っているので、通常は Y のまま書き出します。

アップ軸とは別に、前方向(キャラクターの正面)の約束ごともエンジンによって異なります。Maya でどの軸を正面にして作るかをチームで決め、矢印の形のテストメッシュでエンジン上の向きを確認しておきます。

FBXのバージョンと形式

Advanced Options の FBX File Format では、Type(タイプ)を通常は Binary(バイナリ)にします。FBX Version(FBX のバージョン)の既定は、インストールされている FBX プラグインの最新版です。受け取り側が古い FBX しか読めない場合はそれに合わせ、プロジェクトで使う版を固定します。

Maya・Unreal Engine・Unity の座標系と単位の比較
図3:上方向と単位は環境ごとに違う。単位の変換は書き出しか読み込みの片方で1回だけ行う

エンジンに入れて確認する

ひとことで:寸法と向きが分かるテストメッシュで、単位・軸・原点・陰影をまとめて確認します。

設定を決めたら、本番の前に次のようなテストメッシュで確認します。

  • 一辺 100cm の立方体:エンジン上で 1m になっているか(単位)
  • 正面を指す矢印:想定した方向を向き、寝ていないか(前方向とアップ軸)
  • 足元をワールド原点に置いた柱:エンジンの原点に立ち、足元を中心に回転するか(原点とピボット)
  • ソフトとハードのエッジを混ぜた形:陰影が Maya と同じか(スムージング グループと法線)

エンジン側では、次のインポート設定をあわせて確認します。

  • Unity(Model タブ):単位は Scale Factor と Convert Units、軸は Bake Axis Conversion、法線は Normals(既定は Import)、タンジェントは Tangents
  • Unreal Engine 5.8(インポート設定):法線の Recompute Normals(オンだと読み込んだ法線を無視して計算し直す)、タンジェントの Recompute Tangents と Use MikkTSpace

書き出しとインポートの設定は、2つで1セットとして記録しておきます。

夕宮たいだ

ぁぅ……Maya の設定が完璧でも、インポート設定で台無しになることがあるんだよねぇ。エンジン側もセットで見てねぇ。

よくある失敗と対処

ひとことで:症状から「単位」「軸」「原点」「面の向き」「法線」「三角化」のどれかに切り分けます。

症状主な原因対処
100 倍・100 分の 1 の大きさになる単位の変換が二重、または未変換FBX の Units とエンジンの Convert Units・Scale Factor を見直し、変換を片方にまとめる
寝ている・横を向いているアップ軸や前方向の食い違いUp Axis を確認し(通常は Y)、正面の軸をテスト用の矢印で確かめる
原点や回転の中心がずれるフリーズ忘れ、基準点がワールド原点にない基準点をワールド原点に合わせて Freeze Transformations と Zero Pivot をかけ直す
面が消える・黒く見える面の裏返り、マイナスのスケールの残りTwo Sided Lighting をオフにして探し、Reverse や Conform で直す
陰影がカクカクする・なめらかすぎるSmoothing Groups がオフ、エンジン側で法線を再計算Smoothing Groups をオンにし、エンジンで法線を読み込む設定か確認する
ノーマルマップに黒い筋や継ぎ目が出る三角形分割やタンジェントの食い違い三角化の方針を統一して焼き直し、タンジェントの計算方式をそろえる
ポリゴン数が急に増えたSmooth Mesh Preview のまま書き出した1 キーでプレビューをオフにして書き出し直す
テクスチャが付いていないテクスチャのパスが切れているテクスチャを別途渡すか、Embed Media(メディアを埋め込む)を使う

チェックリスト

  • [ ] ヒストリを削除し、基準点をワールド原点に合わせて Freeze Transformations と Zero Pivot を済ませた
  • [ ] スケールにマイナスの値が残っていない
  • [ ] Smooth Mesh Preview をオフにしてから書き出した
  • [ ] Smoothing Groups をオンにした
  • [ ] 三角化の方針が、ベイクとエンジンでそろっている(Tangents and Binormals をオンにするなら三角化とセット)
  • [ ] 単位の変換を、書き出し側か読み込み側の片方だけで行っている
  • [ ] Up Axis と FBX のバージョンを、受け取り側に合わせて確認した
  • [ ] 設定をカスタムプリセットとして保存し、チームで共有した
  • [ ] テストメッシュで、エンジン上の大きさ・向き・原点・陰影を確認した

次に読む記事

夕宮たいだ

ふぁ……単位、軸、原点、法線、三角化。これで FBX の事故はだいたい切り分けられる……かなぁ。まずはテスト用の立方体から試してみてねぇ。

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

この記事を書いた人

目次