import bpy import sys import os import argparse glb_input = "trellis_out/sample.ply" obj_output = "obj_output/sample.obj" def parse_args(): argv = sys.argv argv = argv[argv.index("--") + 1:] if "--" in argv else [] p = argparse.ArgumentParser() p.add_argument("-i", "--input", default=True) p.add_argument("-o", "--output", required=True) return p.parse_args(argv) def clean(): bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) def main(): args = parse_args() clean() bpy.ops.import_scene.gltf(filepath=args.input) # 支持 .glb/.gltf # 只保留 mesh,并合并成一个(符合你“单资产”假设) meshes = [o for o in bpy.context.scene.objects if o.type == "MESH"] if not meshes: raise RuntimeError("No mesh objects found in GLB/GLTF.") bpy.ops.object.select_all(action='DESELECT') for o in meshes: o.select_set(True) bpy.context.view_layer.objects.active = meshes[0] if len(meshes) > 1: bpy.ops.object.join() obj = bpy.context.view_layer.objects.active obj.select_set(True) out_dir = os.path.dirname(args.output) if out_dir: os.makedirs(out_dir, exist_ok=True) # bpy.ops.wm.obj_export( # filepath=args.output, # export_selected_objects=True, # export_normals=True, # export_uv=True, # ) bpy.ops.export_scene.obj( filepath=args.output, use_selection=True, # 只导出选中的对象 use_normals=True, use_uvs=True, use_materials=True, # 根据需要改(你原来没导出材质) axis_forward='-Z', # glTF 通常是 -Z forward,Y up,可根据需要调整 axis_up='Y', # keep_vertex_order=True, # 可选:保持顶点顺序 ) if __name__ == "__main__": main()