概要
BlenderからMixamo用のファイルを出力する方法を紹介します。
デフォルトではFBXにはテクスチャが含まれないため、Blenderから出力したFBXをMixamoにアップロードしてもテクスチャが反映されないようです。
ここでは、テクスチャを反映する方法として、「テクスチャを埋め込む方法」と「FBXとテクスチャをZIP化する方法」の2種類を紹介します。
なお、複雑なシェーダーノードはMixamoで認識されないので、一度テクスチャにベイクする必要があります。
方法1:テクスチャを埋め込む方法
手順
- FBXをエクスポートするときに、パスモードをコピーにして、
テクスチャを埋め込む
をオンにする(下図の赤い枠) - MixamoにFBXファイルをアップロードする。
Pythonで実行
ファイル作成の手順をPythonで記述すると以下のようになります。
対象のオブジェクトを選択して、下記を実行すると、Blenderファイルと同じ場所に、FBXファイルを作成します。
from pathlib import Path
import bpy
def main():
if not bpy.data.filepath:
print("Save blend file.")
return
if not bpy.context.selected_objects:
print("Select target.")
return
fnam = str(Path(bpy.data.filepath).with_suffix('.fbx'))
bpy.ops.export_scene.fbx(
filepath=fnam, use_selection=True, path_mode="COPY", embed_textures=True)
print(f"Create {fnam}")
if __name__ == "__main__":
main()
方法2:FBXとテクスチャをZIP化する方法
FBXファイルとは別にテクスチャをファイルに保存し、ZIPでまとめる方法です。テクスチャを一覧しやすくなります。
手順
- 関連するテクスチャをファイルとして保存する。
- 同じディレクトリにFBXをエクスポートする。
- エクスポート時にパスモードをストリップパスにして、パスを無視する。
- これらのファイルをZIP化する。
- MixamoにZIPファイルをアップロードする。
Pythonで実行
ファイル作成の手順をPythonで記述すると以下のようになります。
対象のオブジェクトを選択して、下記を実行すると、Blenderファイルと同じ場所に、ZIPファイルを作成します。
実行すると、テクスチャのパスが変わりパックが解除されるので注意してください。
import shutil
import tempfile
from pathlib import Path
import bpy
def main():
if not bpy.data.filepath:
print("Save blend file.")
return
if not bpy.context.selected_objects:
print("Select target.")
return
with tempfile.TemporaryDirectory() as td:
for obj in bpy.context.selected_objects:
for slot in obj.material_slots:
mat = slot.material
if mat and mat.use_nodes:
for node in mat.node_tree.nodes:
if node.type == "TEX_IMAGE" and node.image:
node.image.filepath = f"{td}/{node.image.name}.png"
node.image.save()
fnam = Path(bpy.data.filepath)
bnam = f"{td}/{fnam.stem}.fbx"
bpy.ops.export_scene.fbx(filepath=bnam, use_selection=True, path_mode="STRIP")
shutil.make_archive(fnam.with_suffix(""), format="zip", root_dir=td)
print(f"Create {fnam.with_suffix('.zip')}")
if __name__ == "__main__":
main()
以上