
目录glb查看器bpy fbx转glbfbx转glbglb查看器Babylon.js Sandboxbpy fbx转glbimport json, trimesh import numpy as np import bpy import os def fbx_to_glb(fbx_path, glb_path): # 清空场景 bpy.ops.wm.read_factory_settings(use_emptyTrue) # 导入 FBX bpy.ops.import_scene.fbx(filepathfbx_path) # 导出 GLB bpy.ops.export_scene.gltf(filepathglb_path, export_formatGLB) # 使用 fbx_to_glb(test.fbx, test.glb)fbx转glbexport_glb.pyimport bpy import os import sys import shutil import argparse import trimesh def clean_env(): for obj in bpy.data.objects: obj.select_set(True) # 选择所有对象 bpy.context.view_layer.objects.active None # 确保当前没有活动的对象 bpy.ops.object.delete() for obj in list(bpy.data.objects): bpy.data.objects.remove(obj, do_unlinkTrue) # 3. 删除所有材质 for mat in bpy.data.materials: bpy.data.materials.remove(mat) # 4. 删除所有纹理 for tex in bpy.data.textures: bpy.data.textures.remove(tex) # 5. 删除所有灯光 for light in bpy.data.lights: bpy.data.lights.remove(light) # 6. 删除所有相机 for cam in bpy.data.cameras: bpy.data.cameras.remove(cam) # 7. 删除所有场景中的集合可选 for collection in bpy.data.collections: bpy.data.collections.remove(collection) bpy.ops.outliner.orphans_purge() bpy.ops.screen.animation_cancel() def convert_bone_name(prefix_list): new_prefix mixamorig: armature bpy.context.active_object if armature and armature.type ARMATURE: for bone in armature.data.bones: sp bone.name.split() if len(sp) 1 and sp[0] in prefix_list: x bone.name bone.name new_prefix sp[1] print(frename {x} -- {bone.name}) def export_textures2(fbx_file, output_folder): # 导入FBX文件 # ori_fbx_file fbx_file.replace(.fbx, _ori.fbx) # shutil.copy(fbx_file, ori_fbx_file) bpy.ops.import_scene.fbx(filepathfbx_file) bpy.ops.file.unpack_all(methodUSE_LOCAL) target bpy.context.selected_objects[0] convert_bone_name([Bone]) # 转为mixamo格式 bpy.context.scene.frame_set(0) objpath fbx_file.replace(.fbx, .obj) bpy.ops.wm.obj_export(filepathobjpath) bpy.context.view_layer.objects.active target if bpy.context.active_object.mode ! OBJECT: bpy.ops.object.mode_set(modeOBJECT) mesh trimesh.load_mesh(objpath) target.scale target.scale * 2 / mesh.scale print(ftarget.scale {target.scale}) bpy.ops.object.transform_apply(locationFalse, rotationTrue, scaleTrue) bpy.ops.export_scene.gltf(filepathfbx_file.replace(.fbx, .glb), export_formatGLB, export_animationsFalse) print(done) # /Applications/Blender.app/Contents/MacOS/Blender --background --python /Users/jing/code/demo/python_demo/py_iceberg/3d/test3.py # 执行主函数 if __name__ __main__ or __name__ run_path: parser argparse.ArgumentParser() parser.add_argument(--fbx, defaultrE:\project\smpl\render_blender\test_data\805\Jolleen\Jolleen.fbx, helpfbx path) parser.add_argument(--textures, defaultrE:\project\smpl\render_blender\test_data\805\Jolleen, helptextures path) try: argv sys.argv[sys.argv.index(--) 1:] args parser.parse_args(argv) except Exception as e: args parser.parse_known_args()[0] # 进入到指定目录执行解包操作会在当前的目录下生成texttures 目录 fbx args.fbx output args.textures if fbx or output : print(no fbx or output) exit(1) print(fbx, output) try: clean_env() os.makedirs(output, exist_okTrue) os.chdir(output) export_textures2(fbx, output) except Exception as e: print(ferror {e}) exit(-1)