Skip to content

Instantly share code, notes, and snippets.

@SakaITa

SakaITa/merge.py

Created Mar 31, 2021
Embed
What would you like to do?
# FBX ファイルをメッシュ結合して一つの FBX ファイルにする Blender 用スクリプト
# 引数で指定したフォルダ内のすべての FBX をインポートして、
# すべてのメッシュを一つに結合し、一つの FBX ファイルにエクスポートする
#
# 呼び出し例
# blender --background --python ./merge.py -- --folder fbxfolder
#
# bpy = Blender Python。各コマンドはこのモジュールに紐付いている
import bpy
import glob
import os
import time
import sys
import argparse
# https://bluebirdofoz.hatenablog.com/entry/2018/04/23/000846
# メッシュオブジェクトの結合
# 引数 arg_objectname:結合オブジェクト名
# 戻り値
def join_objects_mesh(arg_objectname=''):
# シーン中の全てのオブジェクトを走査する
for ob in bpy.context.view_layer.objects:
# オブジェクトがメッシュであるか確認する
if ob.type == 'MESH':
# メッシュであれば選択状態にする
ob.select_set(True)
# 対象アクティブオブジェクトに切り替える
# メッシュはアクティブオブジェクトに結合される
bpy.context.view_layer.objects.active = ob
else:
# メッシュでなければ選択状態にしない
ob.select_set(False)
# オブジェクトの結合を実行する
bpy.ops.object.join()
# 結合オブジェクト名が設定されているか
if len(arg_objectname):
# オブジェクト名が設定されていれば名前を変更する
# https://qiita.com/hibit/items/d6b92d49d4d3a5730aa4
bpy.context.view_layer.objects.active.name = arg_objectname
return
# https://qiita.com/TeppeiMIURA/items/9b6ddacd451d8e24bf72
# フォルダ名取得
parser = argparse.ArgumentParser()
parser.add_argument('--folder', type=str, required=True, help='folder: target')
args = parser.parse_args(sys.argv[sys.argv.index('--') + 1:])
folder = args.folder
# https://zenn.dev/jujunjun110/articles/203ad46ba57beb
# 最初に全削除
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=True)
# インポート処理
importDir = f'./{folder}/'
os.chdir(importDir)
# fbxファイルの一覧を取得
paths = glob.glob("*.fbx")
for path in paths:
bpy.ops.import_scene.fbx(filepath=path, axis_forward="-Z", axis_up="Y")
join_objects_mesh(folder)
# エクスポート
exportFile = f'./{folder}.fbx'
bpy.ops.export_scene.fbx(filepath=exportFile, embed_textures=True, path_mode='COPY')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment