MayaのモデルをFBXでBlenderに持っていくと、サイズは合っているのにオブジェクトのスケールが 0.01 になっている。回転にも見覚えのない 90 度が乗っている。これを「バグ」と思って毎回Ctrl+Aで潰している人は多いが、実際には両者の既定値の差がそのまま出ているだけだ。どこで何が起きているのかを、両方をコマンドラインで動かして測った。
検証環境と方法:Maya 2025(FBXプラグイン 2020.3.6)を mayapy で、Blender 3.6.11 を -b --factory-startup で、どちらもGUIを開かずに動かした。100×100×100 の立方体(Maya単位=cm なので実寸1m)を translateZ 200・rotateX 30 で置き、FBXに書き出してBlenderで読み込んだ数値を比較している。測っていない範囲=Blender 4.x/5.x での再現、アーマチュアやアニメーションを含むデータ。
スケールが0.01になるのはなぜ?
サイズは合っている。合っていないのはスケール値のほうだ。既定のまま読み込むと、寸法は 1.00m 角で正しいのに、オブジェクトのスケールは 0.01 と表示される。理由は単純で、両者の既定がずれているからだ。
| Maya 2025 | Blender 3.6.11 | |
|---|---|---|
| 長さの単位 | cm | m |
| 上方向 | Y-up | Z-up |
FBXには「1単位が何cmか」を表す UnitScaleFactor が入っている。Mayaが書いた値は 1、つまり1単位=1cmだ。Blenderは1単位=1mなので、100単位の立方体を 1.00m として置くためにオブジェクト側に 0.01 の倍率を持たせる。メッシュデータは100単位のまま残っている。回転の 90 度も同じ理屈で、Y-up→Z-up の変換がオブジェクトの回転値として乗っている(元の 30 度と足されて 120 度になる)。
形と位置が保たれていることは、両者のワールド座標を突き合わせれば確かめられる。
| Maya(cm) | Blender(m) | |
|---|---|---|
| 幅 | X −50.00 〜 50.00 | X −0.500 〜 0.500 |
| 上下 | Y −68.30 〜 68.30 | Z −0.683 〜 0.683 |
| 前後 | Z 131.70 〜 268.30 | Y −2.683 〜 −1.317 |
100で割ると3軸とも一致し、Mayaの上方向(Y)がBlenderのZに、Mayaの前後(Z)が符号を反転してBlenderのYに写っているのが読み取れる。これがY-up→Z-up変換の中身で、寸法も形も失われていない。
スケール値を1にするには?
インポート時のオプション「トランスフォームを適用」(英語UIでは Apply Transform)を入れる。同じFBXを条件だけ変えて読み込んだ実測がこれだ。
| 読み込み条件 | 寸法 | スケール | X回転 |
|---|---|---|---|
| 既定のまま | 1.00m角 | 0.01 | 120° |
| トランスフォームを適用 | 1.00m角 | 1.00 | 30° |
| スケールに 0.01 を入力 | 0.01m角 | 0.0001 | 120° |
| Maya側をZ-upで書き出し | 1.00m角 | 0.01 | 120° |
2行目が答えで、寸法を変えずにスケールだけが 1.00 になり、軸変換ぶんの 90 度も消えてMayaで付けた 30 度だけが残る。
ただしリグ入りのデータには使わない。このオプションの説明文には、Blender自身の言葉で「experimental option, use at own risk, known to be broken with armatures/animations」と書かれている。実験的で、アーマチュアとアニメーションでは壊れることが知られている、という意味だ。アーマチュアやアニメーションを含むデータでは使わない。なお今回測ったのはリグを含まない立方体1つで、「静的メッシュなら常に安全」を確かめたわけではない。
インポート時に「スケール 0.01」を入れてはいけない
「cmからmだから 0.01 を入れる」——これが3行目で、1cmの立方体になる。単位換算はすでに済んでいるので、そこへ 0.01 を掛けると二重に縮む。
Blender同梱のインポータのコードも同じことをしている。ファイルから読んだ UnitScaleFactor をシーンの単位で割った値を、ユーザーが指定した倍率に掛ける——つまり「スケール」欄は換算の代わりではなく換算の後にもう一度掛かる係数だ。ここは 1.00 のまま触らない。
Maya側で「Z-up」に切り替える意味はあるのか?
Blenderへ渡すだけなら、無い。表の4行目がそれで、FBXExportUpAxis z を指定して書き出しても、Blenderでの結果は既定と1桁も変わらなかった。
「Blenderに渡すならZ-upで出せ」という説明をよく見かけるので、ファイルの中身を直接見て確かめた。書き出したFBXをテキスト形式で比べると、2つのファイルは確かに違う。
| Y-upで書き出し | Z-upで書き出し | |
|---|---|---|
ヘッダの UpAxis |
1(Y) | 2(Z) |
| ノードの移動量 | (0, 0, 200) | (0, −200, 0) |
| 頂点座標 | まったく同じ | |
つまりMayaはデータそのものを回してから書き出し、それに合う軸情報をヘッダに書いている。そしてBlenderは「方向を手動で設定」を切っている限りヘッダの軸情報を読んで変換する——インポータのコードでも、手動指定でないときだけファイルの UpAxis と FrontAxis を読むようになっている。データと申告が両方ひっくり返るので、行き先で元に戻る。
だからMaya側の設定を変えて回避しようとしても、スケール0.01と90度は消えない。消すのは受け取り側の「トランスフォームを適用」だ。
ASCIIで書き出すと読み込めない
MayaのFBX書き出しにはASCII形式のオプションがあるが、Blenderはこれを開けない。実際に読ませるとインポートは始まらずエラーで止まる。
RuntimeError: ASCII FBX files are not supported
共有されたFBXが開けないときは、ファイルの先頭を見れば一目で分かる。バイナリなら Kaydara FBX Binary、ASCIIなら ; FBX 7.7.0 project file のようなコメント行で始まる。書き出し側で「ASCII」のチェックを外して出し直してもらえば済む話だ。MayaのFBX書き出しで詰まりやすい設定はMaya × Substance Painterのエラー集でも整理している。
よくある質問
スケールが0.01のままでも問題ありませんか?
Maya側の単位をメートルに変えれば解決しますか?
Blender 4.xや5.xでも同じですか?
blender-addons)の main ブランチにある io_scene_fbxで、オプションの名称とアーマチュア/アニメーションの警告文が3.6.11の同梱版と一致していました。そのブランチがどの製品版に対応するかまでは追っていませんので、数値はお手元の版で一度確かめてください。まとめ:直すのは受け取り側
- スケール0.01はMaya(cm)とBlender(m)の既定差。寸法自体は正しい
- スケールを1にするのは読み込み時の「トランスフォームを適用」
- ただしそれはアーマチュア/アニメーションでは壊れると公式に明記された実験的オプション
- 「スケール」欄に 0.01 を入れると二重に縮む。1.00 のまま触らない
- Maya側をZ-upで書き出してもBlenderでの結果は変わらない
- BlenderはASCII形式のFBXを開けない。先頭が
Kaydara FBX Binaryかを確認する
受け渡しでつまずくポイントは、たいてい書き出し側ではなく読み込み側の設定に集まっている。Mayaのオプションを総当たりする前に、インポートパネルを1つずつ試したほうが早い。なお読み込んだあとで面が黒くなるのは軸や単位とは別の話で、法線の向きを疑うことになる。

コメント