Files
AIGame/Tools/model_tools/bl_restore_yup.py
T
udxandCursor 9793d8581d Add TownSquare scene assets, resource production docs, and model pipeline updates.
Bring in plaza props/prefabs, ZhaoYun source GLB, design originals, and Hunyuan/Blender tooling used to produce them.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-28 14:28:46 +08:00

59 lines
1.7 KiB
Python

"""把游戏 FBX 整理成混元 GLB 轴向(Y-up)且原点在底面中点。可重复执行。
调用:blender -b --factory-startup --python bl_restore_yup.py -- <fbx> [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()