【Blender】FBXをglTF形式に一括変換するPythonスクリプト
所用で元々持っている大量のFBXファイルを一旦全部glTF形式(.glbバイナリ)に変換する必要が出てしまって、手でやっていられないのと、Blenderだったら出来るのかなと思ってやったらあっさりできたので。
How to convert FBX to glTF or glb.
やり方
考え方
以下の順序で動いてくれればいいと考えた。あとはBlender APIから目的の処理を探すだけ。
- 処理したいフォルダの先頭から、再帰的にすべてのFBXファイルの絶対パスを得る。
- Blenderのコレクション内のオブジェクトを全部削除する。
- FBXファイルをインポートする
- glTF(.glb)形式でエクスポートする
- 以上の処理を絶対パスの数だけ繰り返す
スクリプト
# #FBXをインポートして、glbファイルでエクスポートするスクリプト # import glob import os import pathlib from os.path import abspath, join, split #ルートディレクトリから再帰的に検索してFBXファイルの絶対パスを得る files = glob.glob('D:/Projects/Data/Model/FBX/**/*.fbx', recursive=True) for file in files: print(file) #debug... name = os.path.splitext(os.path.basename(file))[0] dir = os.path.dirname(file) dir_path = pathlib.Path(file) file_out = dir_out + '/' + name + '.glb' print(' [export] ' + file_out) # all remove bpy.ops.object.select_all(action="SELECT") bpy.ops.object.delete(True) # import fbx bpy.ops.import_scene.fbx(filepath=file) # export gltf (.glb) bpy.ops.export_scene.gltf(filepath=file_out, export_format='GLB', ui_tab='GENERAL')
補足説明
glob.glob(‘D:/Projects/Data/Model/FBX/**/*.fbx’, recursive=True)
glob.glob()関数ですが、
・recursive=Trueで再帰的な処理ができます。
・検索ワードは {ディレクトリのパス}/**/*.{拡張子} と書くことで拡張子指定できます。
name = os.path.splitext(os.path.basename(file))[0]
拡張子を除いたファイル名を得ることが出来ます。
(例)
file = ‘D:/Projects/Data/Model/FBX/Animal/Cat/Cat01.fbx’ のとき
name = Cat01 となる
Blenderのコマンド
bpy.ops.object.select_all(action=”SELECT”) #すべてを選択します。Aキーと同じ
bpy.ops.object.delete(True) #削除します。Deleleキーと同じ
bpy.ops.import_scene.fbx(filepath=file)
FBXファイルをインポートします。
メニュの[file]→[import]→[fbx]→[ファイルを選択してOK]と同じ動作。
細かいオプションはBlender Python APIリファレンスを見ると載っています。
bpy.ops.export_scene.gltf(filepath=file_out, export_format=’GLB’, ui_tab=’GENERAL’)
glbファイルをエクスポートします。
メニュの[file]→[export]→[gltf→[ファイル名を入力してOK]と同じ動作。
細かいオプションはBlender Python APIリファレンスを見ると載っています。
参考サイト
・Export Scene Operators – Blender Python API
・Import Scene Operators – Blender Python API