FBX SDK Python FBX Version Convert Script

あー、こーゆーのもあんのね。
というのがFBX SDKの記事を目にした時の第一印象でした。
C4D、Blenderを主に使用しているのでそんなのどうつかうん?という感じです。
Mayaを使っていた頃にはなんとなく存在自体は知っていた気がしますが
それで何ができるかとかはしらず、さらにいえば自分には縁のないモノであろうということで
忘れ去っていました。

では今回なぜ使うことになったかと言いますと、ポメロ越田くんから
Blender→3dsMaxへのデータコンバートでうまくいかないシーンデータがある
との相談をいただいたからなのですが、、、
その際はもちろん可及的速やかに確実な検証込みのデータ渡しが必要ですので
そー言った場合の前提として、立ってるモノは親でもつかえの精神で最短・確実を目指します。

Blender→(fbx)→Cinema4D→(fbx)→3ds Max

という解を検証の結果導きだせました。
これはまさに最短でかつ確実性を重視した手持ちツールつかうパターンです。
早速、4シーンをコンバート・確認しデータを提供させていただきました。

この手の検証をひと昔前の制作さんなどは
新たな何かを生み出さない、時間をかければ誰にでもできる
というような先入観で軽視される方が多かったように思いますが
本来的な意味で考えると、、、
入出力での比較において一致することはマストであり(でなければやる意味がありません。)
検証には集中力を要しますから4シーン程度でもまずまず時間はかかるものです。

もちろん、一定程度検証を重ね再現性を担保でき方法論として確立できれば
あまり慎重である必要がなくなる事はいうまでもありません。撮って出しでもよくなる場合もあるでしょう。

さて、話を本線に戻します。
では問題なく処理・納品して終了したのになぜエントリータイトルのような状況になったかといいいますと、、、

Get Started!!

先々を考えてのことです。
ポメロを含め、データ変換においてC4Dを挟むことができない場合がほとんどだよなー
などと考えつつ検証・開発のリサーチを進めている過程で
AutodeskからFBXに関してSDKが提供されておりさらにPythonのAPIもあるということを知ったからです。
これは使えるなら使いたい。中間に有料のツール、使い慣れないツールを経由する必要がなくなるかもしれない。
さらに個人的なことですが3Dシーンのデータコンバートは、とりあえずFBXで行うからというのもあります。
※EmberGenもそうでした。

自分の常識はそんなですから、当然盛んに情報交換なども行われているだろうとおもったんですが、、、
web上の情報は全然です。SDKも最新が2020。更新は滞っている印象。
さらに使用傾向としてはUintyやUEと他のツールのパイプライン用が多い印象です。
しかも、情報がわずかにあっても、こんなものを使おうというのは歴とした開発者らしくC++での情報がほとんど。
わざわざpythonで書こうなんてホビーデベロッパーはあまりおらず情報がかなり少ないです。

Let’s Dev!

とまー、そーは言ってもこれまでに踏み込んできた自分の領域内ならともかく
全然わかりもしないC++で、解りもしないツールを書き始めるほどの
向こうみずでもないので、まずはpyenvで3.10系の環境を作りfbx sdkをpipインストールし
Cursor経由でGPT4oに手伝ってもらいつつ書き始めたんですが
諸々細かくプロンプトするとサクッとテストコードを書いてくれました。
それは以下のようなプロンプトです。

  1. 使用用途。既存のfbxを読み込んで、fbxのプラグインバージョンを変更して出力する。
  2. 使用するSDKのバージョンと使用言語を指定する。
    (この際Pythonを指定しないと問答無用で情報量の多いC++のコードを提示されます)
  3. 任意のソースファイル(fbx)と、出力(先)ファイル(fbx)を指定する。
  4. 出力ファイルのfbxのプラグインバージョンを指定する

ここまでカッチリとプロンプトすると
迷いや曖昧な点もなくテストコードを作成してくれます。
が、、、、どうしても肝になるところで1箇所エラーが出ます。
デバッグしたかんじでは他は全然問題なく動作している。
ここから1週間、頭を悩ませることなるとは、、、、他の作業中も気が散ってしまう。

My Brain’s Lightning !!! After the Dark

概ね1週間後。ランニング前のひらめきでこのエラーは解決しました。
どうやら、SDKのバージョンによって書き方が違っていたということのようでした。
しかも、それを用いたPythonのサンプルコードはweb検索では見つけられません。
web上にある既知の情報やSDK公式ドキュメントにおいての言及がない以上は
GPTくんに聞いたとてわかりえないのです。
だってSDKのバージョンを指定したにも関わらずのこの結果ですからね
無論それ以前にCursorの無料分は最初の段階で使いきっていたわけですが 汗

なんだかんだで、ひらめきで解決できたことによって脳というのはなかなかすごいなと思いました。
というか意識とは無関係に何かしらアイドリングで考えてるってことなんだろうという実感を得ましたね。

This is Result

そしてこのツールを作って変換した肝心の結論ですが、

Blender→(fbx)→fbxバージョン変換ツール→(fbx 2012-2020)→3ds Max

では、残念ながら解決できませんでした。
Blenderからの出力時点で何かしらベイクかクリーンアップのような処理が必要なのだろうと想定します。

Other Ways

ちなみに
Alembic(*.abc)でも結果は大差ありませんでした。
Collada(*.dae)であればまずますいい線行きますが、
おそらく一部のオブジェクトに想定外のトランスフォームが残ったりします。

これを解決するには
とりあえずはC4Dのような他のツールを経由するか、
Blender add-on(Better FBX IEがかなり良さそう)を片っ端から試してみるしかない
のかもしれません。



コメントを書く