You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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操作:

  1. 打开Automator,新建应用程序类型的工作流
  2. 添加「运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:25:14