"""把游戏 FBX 整理成混元 GLB 轴向(Y-up)且原点在底面中点。可重复执行。 调用:blender -b --factory-startup --python bl_restore_yup.py -- [fbx...] """ import json import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from bl_decimate import ( # noqa: E402 export_fbx_source_yup, import_model_objects, prepare_game_export, ) def restore_file(path): import bpy bpy.ops.wm.read_factory_settings(use_empty=True) imported = import_model_objects(path) meshes = [o for o in imported if o.type == "MESH"] if not meshes: return {"path": path, "error": "no mesh"} for obj in meshes: prepare_game_export(obj) bpy.ops.object.select_all(action="DESELECT") for obj in meshes: obj.select_set(True) bpy.context.view_layer.objects.active = meshes[0] export_fbx_source_yup(path) verts = meshes[0].data.vertices xs = [v.co.x for v in verts] ys = [v.co.y for v in verts] zs = [v.co.z for v in verts] return { "path": os.path.basename(path), "meshes": len(meshes), "min_y": round(min(ys), 6), "mid_x": round((min(xs) + max(xs)) * 0.5, 6), "mid_z": round((min(zs) + max(zs)) * 0.5, 6), } def main(): argv = sys.argv[sys.argv.index("--") + 1 :] results = [] for raw in argv: path = os.path.abspath(raw) if not os.path.isfile(path): results.append({"path": raw, "error": "missing"}) continue results.append(restore_file(path)) print("MT_SUMMARY " + json.dumps(results, ensure_ascii=False)) if __name__ == "__main__" and "--" in sys.argv: main()