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>
59 lines
1.7 KiB
Python
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()
|