Skip to main content

FBX地獄

0) まだ見ぬ地獄がそこにはある

  • FBXは地獄といわれている。その地獄の案内図である。
  • FBXはインデックス空間・座標系・参照モデルが“複数”混在するため、素直に読むと破綻する。
  • Importerで正規化(頂点/ボーン/アニメ/素材の各レイヤを、自分のランタイムに合わせて再マップ)しないと地獄行き。
  • FBXSDKは強力だが、LayerElementの Mapping/Reference、Axis/Unit 変換、Transformのピボット系、Skin/BlendShapeの解釈を間違えると沼に落ちる。

1) メッシュ/頂点地獄

症状

  • 頂点インデックスが合わない」「法線やUVが面ごとにバラバラ」「トライアングル化で壊れる」。
  • スキンウェイトを頂点に当てると崩れる。

原因

  • FBXSDKでの頂点概念の違い
    • Control Point(論理頂点=位置配列)
    • Polygon Vertex(フェイス頂点=コーナー=面内の頂点)
    • LayerElementは Mapping(eByControlPoint / eByPolygonVertex …)Reference(eDirect / eIndexToDirect を持つ。ここを誤ると属性(Normal/UV/Color/Material)を別インデックス空間で読んでしまう。 [help.autodesk.com], [help.autodesk.com]

対処

  • FbxLayerElementGetMappingMode()GetReferenceMode() を必ず確認し、
    • eByControlPoint は CP インデックスで、
    • eByPolygonVertex面頂点(コーナー) で引く。
    • eIndexToDirect の場合は IndexArray → DirectArray の二段引き。 [help.autodesk.com]
  • FBXSDKのサンプル「Meshes」を見て、Control Point とポリゴン頂点の違いと初期化/トライアングル化の流れを把握する。 [help.autodesk.com]

2) ボーン/スキン地獄

症状

  • ウェイトが合わない」「ボーンの行列が違う」「BindPoseと計算結果がズレる」「DualQuaternion/Linearで結果が違う」。

原因

  • Skinは Control Point 基準で、Cluster(ボーン)ごとにCPインデックス+ウェイトで定義される。
  • Skinningタイプは Rigid/Linear/DualQuaternion/Blend があり、計算方法が異なる。
  • Bind Pose(FbxPose) は「スキン拘束時のグローバル行列のスナップショット」であり、使い方を誤ると逆行列/オフセットの計算が狂う。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]

対処

  • ウェイト適用は CP単位で集計した後、ランタイム頂点へ再投影する(コーナー分裂を理解)。 [help.autodesk.com]
  • FbxSkin::GetSkinningType() を見て、自前スキニングのアルゴリズムを分岐。 [help.autodesk.com]
  • BindPose(FbxPose)の仕様(グローバル行列が基本)を確認し、ボーンオフセット行列の導出(Bind姿勢の逆)と、階層評価の順序を厳守。 [help.autodesk.com]

3) トランスフォーム(TRS+ピボット+プリ/ポスト回転)地獄

症状

  • ローカル/グローバルが合わない」「回転順序で破綻」「スケール継承で単位変換が壊れる」「ジオメトリ変換が二重適用」。

原因

  • FBXノードにはLclTranslation/Rotation/Scalingに加え、GeometricTranslation/Rotation/Scaling(ジオメトリオフセット)、PreRotation/PostRotation、Pivot/Offsetなどが存在。
  • 継承タイプ(eInheritRrSs/eInheritRSrs/eInheritRrs)により親のスケールの伝播が変わり、ユニット変換で事故る。 [help.autodesk.com], [help.autodesk.com]

対処


4) 座標系/単位変換地獄

症状

  • Z-up/Y-upで向きが変」「スケールがおかしい」「メッシュ頂点は変わってないのに配置が崩れる」。

原因

  • FBXSDKのデフォルトは右手系・Y-up。Axis/Unit変換はノードのプリローテーション/スケール&アニメに作用し、頂点値は変えない
  • Rrs継承ノードに対する単位変換は特に危険。オプション指定が必要。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]

対処

  • FbxAxisSystem::ConvertScene()FbxSystemUnit::ConvertScene()ロード直後に一度だけ行い、オプションmConvertRrsNodes など)を適切に設定。 [help.autodesk.com], [help.autodesk.com]
  • 変換はアニメとノード行列にのみ影響し、メッシュ頂点値は変わらないことを前提に、その後の全評価を統一座標系で行う。 [help.autodesk.com]

5) アニメーション評価・リサンプリング地獄

症状

  • 時間軸(fps)がズレる」「補間が崩れる」「複数レイヤの結果が違う」「Take/Stackの切り替えで値が変」。

原因

  • FBXSDKのアニメ構造は Stack → Layer → CurveNode → Curve の多段。評価は FbxAnimEvaluator が担当。
  • FBXファイルバージョン間で**タイムベース(例:7700のミリ秒定義変更)**が異なり、旧SDKだとタイミングがズレることがある。 [help.autodesk.com], [help.autodesk.com], [coohom.com], [zenn.dev]

対処

  • Evaluatorでの時刻評価(EvaluateGlobalTransform(time))を一貫使用。レイヤ合成の仕様を理解する。 [help.autodesk.com]
  • 必要に応じて FbxAnimCurveFilterResample等間隔フレームにリサンプルし、ランタイム側の更新ステップと一致させる。 [help.autodesk.com]
  • SDK/FBX版数の互換性に注意(必要なら古いFBXエクスポート版へダウングレード)。 [daz3d.com]

6) マテリアル/テクスチャ/レイヤード地獄

症状

  • PBRが消える」「レイヤードテクスチャが反映されない」「テクスチャパスが死ぬ」「UVセットの選択が合わない」。

原因

  • FBXSDKの標準はPhong/Lambertベース。DCCのPBRはベイクしてテクスチャへ落とす必要。
  • FbxLayeredTexture や複数UVセットは接続関係(Materialのプロパティにテクスチャ接続)とUVマッピングの指定を正しくたどる必要がある。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]

対処

  • DCC側でPBRをベイク(Metal/Rough 等のテクスチャ) → FBXでEmbed Mediaか、外部参照の相対パス統一。 [help.autodesk.com], [help.autodesk.com]
  • テクスチャは Materialプロパティ(Diffuse等)に Connect、UVはLayerElementUVのMapping/Refを確認。 [help.autodesk.com]

7) ブレンドシェイプ(モーフ)地獄

症状

  • モーフが反映されない」「中間ターゲット(in-between)が崩れる」「複数ターゲットの重み進行がおかしい」。

原因

  • BlendShape → BlendShapeChannel → Shape の三層構造。
  • Channelごとに複数ターゲット/FullDeformPercent(進行率)を持つため、単純な1ターゲット想定だと破綻。 [help.autodesk.com], [help.autodesk.com]

対処

  • Channel単位で DeformPercent を評価し、ターゲット配列と進行率を踏まえてメッシュ差分を合成。 [help.autodesk.com]

8) ファイルフォーマット/互換性地獄

症状

  • ASCII/Binaryどっち?」「新しいFBXが古いツールで読めない」「埋め込みメディアが消える」。

原因

  • FBXはプロプライエタリ、かつバージョン差が大きい。ASCII/Binaryで挙動違い、古いSDKやツールでバージョン非互換が発生。 [en.wikipedia.org]

対処

  • ターゲット(ゲームエンジン/ツール)のSDK版に合わせてFBXバージョンを選択(必要なら2014/2016/2020系へダウングレード)。 [daz3d.com]
  • 開発時はASCIIで可視化・デバッグ、配布はBinary(軽量・高速)を推奨。 [gamedev.st...change.com]

9) FBXSDK“運用”地獄(設計・APIの落とし穴)

症状

  • オブジェクト寿命管理でメモリリーク」「スレッドセーフと誤解」「シーン評価と自前行列が不一致」。

原因&対処


10) 実務向け標準フロー(痛みを最小化するための“正規化”)

  1. シーン読込直後に Axis/Unit を目標系へ統一(Y/Z-up、cm/m など)。オプションで Rrs回避。 [help.autodesk.com], [help.autodesk.com]
  2. メッシュ正規化
    • ControlPoint / PolygonVertex / LayerElement の Mapping/Reference を解決して、ランタイム頂点へ集約。 [help.autodesk.com]
  3. スキン正規化
  4. アニメ正規化
  5. マテリアル/テクスチャ正規化
  6. ブレンドシェイプ正規化
    • Channel単位でDeformPercent評価、ターゲットと進行率を解釈して差分合成。 [help.autodesk.com]
  7. 出力
    • ランタイムでは自前の密なインデックス・配列レイアウトに落とす。FBXは中間/オーサリング専用。 [gamedev.st...change.com]

11) “FBX地獄”チェックリスト(導入時に潰しておく)


12) 参考リンク(実務で頻繁に見る“ドキュメントの核心”)


さいごに

「FBXは中間形式」と割り切り、Importerで“密な配列&自前の一貫した座標・時間・マテリアル表現”に落とすのが最も安全です。