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]
対処
- FbxLayerElement の
GetMappingMode()と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]
対処
- EvaluateGlobalTransform / EvaluateLocalTransform(または
FbxAnimEvaluator)でSDKの評価結果を信頼して取り出す。自前合成は検証用に限定。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com] - ピボットやプリ/ポスト回転はノードプロパティから取るより、Evaluatorに任せるのが安全。 [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の落とし穴)
症状
- 「オブジェクト寿命管理でメモリリーク」「スレッドセーフと誤解」「シーン評価と自前行列が不一致」。
原因&対処
- FbxManager をアプリで唯一作成し、破棄時に配下オブジェクトも破棄されることを理解(寿命管理)。 [help.autodesk.com]
- Evaluatorに統一して時刻評価を行う(自前行列との二重系は避ける)。 [help.autodesk.com]
- SDKサンプル群で「Instances / Transformations / Layers」など、典型的なパターンを一度通す。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
10) 実務向け標準フロー(痛みを最小化するための“正規化”)
- シーン読込直後に Axis/Unit を目標系へ統一(Y/Z-up、cm/m など)。オプションで Rrs回避。 [help.autodesk.com], [help.autodesk.com]
- メッシュ正規化
- ControlPoint / PolygonVertex / LayerElement の Mapping/Reference を解決して、ランタイム頂点へ集約。 [help.autodesk.com]
- スキン正規化
- ClusterのCPインデックス+ウェイトを取り込み、ランタイム頂点へ再投影。SkinningTypeでアルゴリズム分岐。BindPoseはグローバル行列として扱う。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
- アニメ正規化
- Stack/Layer/Curveを
FbxAnimEvaluatorで評価。必要なら 等間隔リサンプリング。FBX版数差(タイム定義)に注意。 [help.autodesk.com], [help.autodesk.com], [zenn.dev]
- Stack/Layer/Curveを
- マテリアル/テクスチャ正規化
- PBRはDCC側でベイクしてテクスチャ接続。複数UVやレイヤードは接続を忠実に追跡。 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
- ブレンドシェイプ正規化
- Channel単位で
DeformPercent評価、ターゲットと進行率を解釈して差分合成。 [help.autodesk.com]
- Channel単位で
- 出力
- ランタイムでは自前の密なインデックス・配列レイアウトに落とす。FBXは中間/オーサリング専用。 [gamedev.st...change.com]
11) “FBX地獄”チェックリスト(導入時に潰しておく)
- LayerElement の Mapping / Reference を網羅テスト(Normal/UV/Color/Material)。 [help.autodesk.com]
- Axis/Unit の ConvertScene を必ず一度だけ。Rrsノードは除外(オプション)。 [help.autodesk.com]
- Evaluator 統一使用(自前TRS合成は検証用途のみ)。 [help.autodesk.com]
- SkinningType と BindPose の仕様確認。CP基準→ランタイム頂点へ再投影。 [help.autodesk.com], [help.autodesk.com]
- アニメのリサンプリング有無(ゲーム側のフレームに合わせる)。 [help.autodesk.com]
- PBRはベイクしてテクスチャに。レイヤード/UV接続の追跡。 [help.autodesk.com], [help.autodesk.com]
- FBXバージョン選択(ターゲットのSDK/インポータ互換性に合わせる)。 [daz3d.com]
12) 参考リンク(実務で頻繁に見る“ドキュメントの核心”)
- LayerElement(Mapping/Reference):FbxLayerElement クラス仕様、実装サンプル(Normals/UV/Layered) [help.autodesk.com], [help.autodesk.com]
- メッシュのCP/ポリゴン頂点:FbxMesh/Meshesガイド [help.autodesk.com], [help.autodesk.com]
- Axis/Unit変換:Scene Axis and Unit Conversion、FbxAxisSystem/FbxSystemUnit 仕様とオプション [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
- Transform評価:Transformation data、Evaluator(FbxAnimEvaluator) [help.autodesk.com], [help.autodesk.com]
- Skin/Cluster/BindPose:FbxSkin/FbxCluster/FbxPose 仕様 [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
- BlendShape:FbxBlendShape/BlendShapeChannel 仕様(in-between対応) [help.autodesk.com], [help.autodesk.com]
- PBR/テクスチャ:Materials/Textures ガイド、LayeredTexture、PBRベイク→FBXエクスポート例(3ds Max) [help.autodesk.com], [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
- アニメ構造とリサンプル:Animation data structures、Evaluator、Resample フィルタ [help.autodesk.com], [help.autodesk.com], [help.autodesk.com]
- FBX版数・互換性:実務上のバージョン選択の議論(フォーラム)、FBXの背景(Wikipedia) [daz3d.com], [en.wikipedia.org]
さいごに
「FBXは中間形式」と割り切り、Importerで“密な配列&自前の一貫した座標・時間・マテリアル表現”に落とすのが最も安全です。
No Comments