Better FBXとBlender標準エスクポーターの違い

追記 2023/06/18
BetterFBXはこの記事を書いた後も精力的にアップデートされています。なので、ここの情報はすでに古いです。気を付けて読んでください。


Better FBXと標準エクスポーターの動作の違いを、FBX SDKを使ってちょっとだけ軽く調べてみました。単純な比較はできないのですが、ほぼデフォルト設定で出力したものを見比べてみて、気づいたことを書き連ねます。

  • RootNode直下のNodeのトランスフォームでスケーリングを修正しない。
    ちゃんと試してないので、確証は持てないのですが、Blender標準エクスポーターのように、RootNode直下のNodeを100倍したりすることで、つじつまを合わせる方法を取っていないようです。
    ただ、Rotationについては、Xで90度の回転が追加されます。これは、エクスポート設定でMayaZUpを選んでもOpenGLを選んでも変わりません。
    後述しますが、メッシュ自体やアニメーションにも、座標系の変換とスケーリングが適用されます。これは、Blenderの内部データを右手YUpに変換するような回転が適用されています。90度のNode回転は、再度逆に回してBlender座標系に巻き戻すような変換です。なぜこのようなことを・・・?
    おそらくですが、Better FBXはNodeのトランスフォームで座標軸の差異を解消しようとしていません。受け手側(UE等)が、Poseを使ってNodeを座標変換することで、最終的なつじつまを合わせる思想ではないでしょうか。
    追記
    上記は、"Optimize For Game Engine"がオンの場合の動作です。これがオンだと、階層に関わらず、Blender上の回転がオール0に、スケールが1.0になったような状態で出力されるようです。そしてFBX上では回転X90が必ず入り、Poseでシーン全体の座標軸とスケーリングの差異吸収だけがなされる、と。つまり本来オブジェクトにあった回転とスケールは良くも悪くも失われるので、複数のオブジェクトから成るモデルを出力するのには使えません。同一メッシュの本が雑然に積まれた本の束、とかね。同一メッシュのレモン(大きさが微妙に違う)が詰まった木箱、とかね。
    "Optimize For Game Engine"がオフだと、どうやら標準エクスポーターと同様に、RootNodeの直下のNodeにスケーリング補正が施されます。ただし、本来の回転とスケールが失われません。なので、上記のような、複数のオブジェクトを組み合わせて作るモデルは、このオプションをオフにした方がよさそうです。

  • アーマチュアNodeが省略される。
    出力設定次第なのですが、アーマチュアがRootNode直下に置かれず、直接第0ボーンがRootNode下に置かれます。実は、アーマチュアのNode自体は孤立して出力されています。

  • MeshのControlPoint(頂点座標)に座標系変換とスケーリングが適用される。
    座標系の変換とスケーリングが、メッシュの段階で適用されます。
    出力設定(MayaZUp or OpenGL)に関わらず、右手X軸から原点を見た時に、時計回りに90度回転する変換が入っています。これは、Blenderの右手ZUpのメッシュを、右手YUpに変換するための回転です。

  • MeshのNomalが最適化される。
    メッシュのノーマルが、Direct方式ではなく、Index方式で保存されています。ファイルサイズが小さくなります。

  • MeshのLayerにeSmoothingタイプのLayerElementが付くようになった。
    設定次第では標準エクスポーターでも付いてくるのかも?(よくわかってない)

  • MeshのLayerにeBiNormalとeTangentタイプのLayerElementが付くようになった。
    これも標準エクスポーターでも、設定次第で出力できるはずです。多分。

  • MaterialにFileTextureが付くようになった。
    ちゃんと調べてはいないのですが、ディフューズBSDFを使ったEeveeマテリアルであっても、テクスチャへの参照が付属するようになりました。

  • Meshの名前に".001"が付かない。
    標準エクスポーターだと、どういうわけか、メッシュの名前の後ろに".001"が付いてました。おそらく内部で一度コピーしていたのでしょう。

  • Scene中のPoseは1個だけ。
    標準エクスポーターだと、メッシュの数だけPoseを生成していました。
    そもそもPoseの扱いが変わっています。ボーンのワールド座標変換行列を記録するためのものではなく、非ボーンのオブジェクト含めた全Nodeの行列を保持しているようです。
    この行列は、出力設定(MayaZUp or OpenGL)によって変わります。原点に回転せずに置いたオブジェクトに対して、OpenGLの時は単位行列、MayaZUpの時はYUpをZUpに変換するような行列が設定されます。

  • Skinに含まれるClusterが、必要数しかない。
    例えば頭だけのメッシュの場合、ClusterはHeadとNeackだけ。これが標準エクスポーターだと、すべてのボーンのClusterを生成していました。

  • アニメーションの開始時間が違う。
    0.0秒で開始していたアニメーションが、-0.0166秒から開始するようになりました。おそらく、Better FBXはフレーム1を0.0秒としているのではないでしょうか。出力設定の「アニメのオフセット」に-1を設定すると、従来通りになるのかもしれません。

  • アニメーションのLocalStopとReferenceStopが、AnimCurve(キーフレーム)の時間範囲と一致しない。
    これは理由がよくわかりませんでした。

  • アニメーションのTranslationにスケーリングが適用されるようになった。これもメッシュの件と一緒で、RootNode直下のNodeでスケーリングをせず、アニメーションにスケーリングを施しています。なので例えば、ジャンプで0.5上に移動していたのが、50移動するように補正されています。
    座標系もおそらく変換されています。

あとは気付いたら追記します~

この記事が気に入ったらサポートをしてみませんか?