FBXとufbxで座標合わせをしたときのメモ(どうせUVのときまた頭おかしくなる用)
結論(このリポの現状)
-
座標系:FBX読込時に 右手系・Y up へ正規化してからロードしています(
opts.target_axes = ufbx_axes_right_handed_y_up)。描画側も RH の LookAt / PerspectiveFov を使っているため、手系・Up軸は一致しています。UfbxAnimSkeleton
D3DApp
-
行列の積み上げ:
EvaluateAt()で local を親の world に掛ける(W = L * Pw) という標準的な階層合成を行い、かつ Skin = W * InvBind でスキン行列を作っています。FBX特有の pre/post-rotation はufbx_evaluate_transform()が面倒を見てくれるので、アニメの動きはFBXと同一になります。UfbxAnimSkeleton
-
行列レイアウトの差:
ufbx_matrix (4x3)を DirectX のXMFLOAT4X4(行メジャ/平行移動は _41/_42/_43) に詰め替えており、転置+配置は関数で一貫させています。可視化はこの_41/_42/_43を使って正しくワールド位置を取っています。UfbxAnimSkeleton
BoneVisualizer
-
カメラ:ボーンのワールド行列群から 中心と半径を推定 → その球が画面に“ちょうど入る”距離に RH ビュー&プロジェクションを自動計算。画角・距離が素直な値なので、モデリングビュー相当の見え方になります(もちろんツールのプリセットFOVと同じにすればより一致)。
WinMain
WinMain
-
タイトル/FPS:Unicode タイトル更新や 60fps リミッタは描画の見え方に影響しませんが、WAPI での文字化け対策含め堅牢です。
D3DApp
同じ見え方にするためのチェックリスト
-
手系/Up軸の一致
-
すでに FBX ロードで RH, Y-up へ正規化済み。描画も RH を使用。→ OK。
(opts.target_axes = ufbx_axes_right_handed_y_up/XMMatrixLookAtRH&XMMatrixPerspectiveFovRH)UfbxAnimSkeleton
D3DApp
-
-
行列の詰め替え規約
-
ToDX_4x4_FromUfbxMatrix4x3()で 回転・並進を DirectX のフィールド配置に揃える。可視化側は_41/_42/_43から位置を取得。→ OK。UfbxAnimSkeleton
BoneVisualizer
-
-
アニメ評価の一貫性
-
ufbx_evaluate_transform()を local として取り、親子で掛け上げて world を得る。FBXの pre/post 回りは ufbx が吸収。→ OK。UfbxAnimSkeleton
-
-
カメラ/FOV
-
ツール側の FOV と合わせると「同じ見え」。コードは 対象を包む球で距離計算して RH の VP を生成。ツール側の FOV が 45°なら
XM_PIDIV4と一致させる。WinMain
WinMain
-
-
クリッピング/遠近
-
znは距離に応じて 0.5 以上、zfは余裕を持たせて設定。D3DAppのリサイズ時もfar=10000。極端に大きい/小さいモデルでも破綻しにくい。WinMain
D3DApp
-
-
単位(スケール)
-
いまのコードは 単位スケールを特別扱いしていません(メートル/センチの換算はしない)。ただし カメラ自動フィットがあるので見た目は実用的に問題なし。モデル同士の相対スケール厳密一致が必要なら、UFbxの
scale_factor等を使うスケーリング導入を検討(今は未使用)。ufbx
-
-
Z反転の重複適用に注意
-
ルートに FlipZ を掛けるコードはコメントアウトのまま。
target_axesで RH 化しているので 追加の反転は不要。もしモデルが「鏡像」に見えたら、反転の二重適用がないかをまず疑う。UfbxAnimSkeleton
-
-
可視化の基準
-
ボーンラインは 親→子の
_41/_42/_43の位置を結ぶだけなので、座標が正しければ「骨の形」は一致します。BoneVisualizer
-
ありがちな“ズレ”と対処
-
左右反転/鏡像に見える
→ どこかで 手系変換+Z反転を二重にしていないかチェック。今のコードではtarget_axesが RH 化を担うので FlipZ を ON にしないのが正解。UfbxAnimSkeleton
-
大きすぎ/小さすぎで消える
→FitCameraToBounds()は 半径から距離を幾何学的に決定しているため、初期表示は安定。遠近クリップは0.1~10000なので、通常用途は問題なし。WinMain
D3DApp
-
モデリングツールの FOV と違う
→ ツール側の FOV に合わせてXM_PIDIV4の値を変更すれば一致が近づきます。D3DApp
まとめ
-
FBX読込時に RH/Y-up へ正規化し、DirectX 側も RH の VP、行列の詰め替えも統一、アニメ評価は ufbx に準拠しているので、理屈上はモデリングソフトの見えと一致します。
-
残る実務的な差異は FOV/単位スケール/反転の二重適用。この3点を上のチェックリスト通りに押さえれば、同じ見え方に落ち着きます。
No Comments