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] マテリアル/テクスチャ正規化 PBRは DCC側でベイク してテクスチャ接続。複数UVやレイヤードは接続を忠実に追跡。 [help.autodesk.com] , [help.autodesk.com] , [help.autodesk.com] ブレンドシェイプ正規化 Channel単位で DeformPercent 評価、ターゲットと進行率を解釈して差分合成。 [help.autodesk.com] 出力 ランタイムでは 自前の密なインデックス・配列レイアウト に落とす。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で“密な配列&自前の一貫した座標・時間・マテリアル表現”に落とすのが最も安全です。