Mac Automator实现Blender批量处理4000个纹理文件可行性咨询
解决方案:Automator + Blender Python脚本结合
可以实现你的需求,但直接用Automator单独完成Blender内部的纹理替换、批量导出操作会非常受限,更高效的方案是用Automator触发流程,核心逻辑交给Blender的Python API实现——这是处理Blender批量任务的标准做法。
一、核心逻辑:编写Blender Python脚本
Blender原生支持Python API,能精准控制模型导入、纹理替换、导出全流程,适合处理4000个纹理的批量任务。以下是脚本框架(根据你的实际路径和模型材质调整):
import bpy import os import traceback # 清除默认场景对象 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete() # 导入你的基础3D模型(替换为实际路径) base_model_path = "/Users/xxx/your_base_model.blend" bpy.ops.wm.open_mainfile(filepath=base_model_path) # 配置路径:纹理文件夹、导出文件夹(替换为实际路径) texture_dir = "/Users/xxx/your_textures_folder" export_dir = "/Users/xxx/exported_models" os.makedirs(export_dir, exist_ok=True) # 确保导出文件夹存在 # 支持的纹理格式 valid_extensions = ('.png', '.jpg', '.jpeg', '.tga') # 获取所有纹理文件 texture_files = [ f for f in os.listdir(texture_dir) if f.lower().endswith(valid_extensions) ] # 获取目标材质(替换为你模型的实际材质名) target_material = bpy.data.materials.get("Base_Material") if not target_material: # 若模型无材质,自动创建一个带节点的材质 target_material = bpy.data.materials.new(name="Base_Material") target_material.use_nodes = True bsdf_node = target_material.node_tree.nodes["Principled BSDF"] # 自动创建纹理节点并连接到Base Color tex_node = target_material.node_tree.nodes.new(type='ShaderNodeTexImage') target_material.node_tree.links.new(bsdf_node.inputs['Base Color'], tex_node.outputs['Color']) else: # 若材质已存在,直接获取纹理节点 bsdf_node = target_material.node_tree.nodes["Principled BSDF"] tex_node = target_material.node_tree.nodes.get("Texture") if not tex_node: tex_node = target_material.node_tree.nodes.new(type='ShaderNodeTexImage') target_material.node_tree.links.new(bsdf_node.inputs['Base Color'], tex_node.outputs['Color']) # 批量处理每个纹理 for tex_file in texture_files: try: tex_path = os.path.join(texture_dir, tex_file) # 加载纹理 texture = bpy.data.images.load(tex_path) tex_node.image = texture # 导出模型(以纹理名称命名,这里用GLB格式,自带纹理嵌入) export_filename = f"{os.path.splitext(tex_file)[0]}.glb" export_path = os.path.join(export_dir, export_filename) bpy.ops.export_scene.gltf( filepath=export_path, export_format='GLB', export_apply=True, export_texture_dir='' ) # 清理已加载的纹理,避免内存占用过高 bpy.data.images.remove(texture) except Exception as e: print(f"处理纹理 {tex_file} 出错: {str(e)}") traceback.print_exc() continue
二、用Automator触发批量流程
Automator的作用是一键启动Blender并运行上述脚本,无需手动打开Blender操作:
- 打开Automator,新建应用程序类型的工作流
- 添加「运行Shell脚本」动作,Shell选择
/bin/bash,输入以下命令(替换为你的脚本路径):
/Applications/Blender.app/Contents/MacOS/Blender --background --python "/Users/xxx/your_blender_script.py"
--background参数让Blender在后台运行,不弹出界面,适合长时间批量处理。
三、关键注意事项
- 先做小批量测试:先用10个左右的纹理测试脚本,确认材质替换、导出格式都正常后,再处理4000个文件
- 路径务必准确:脚本里的所有路径(模型、纹理文件夹、导出文件夹)都要替换为你的实际绝对路径
- 内存优化:4000个纹理会占用大量内存,脚本里加入了
bpy.data.images.remove(texture)来清理临时纹理,避免Blender崩溃 - 错误处理:脚本加入了异常捕获,单个纹理出错不会中断整个流程,错误信息会打印到终端(若需要查看,可在Automator的Shell脚本里添加输出重定向)
内容的提问来源于stack exchange,提问作者Eisenheim
相关产品推荐
相关产品推荐

