模型优化——在MacOS 上使用 Python 脚本批量大幅度精简 GLB 模型(通过 Blender 处理)

目录

前言

配置Blender环境变量

[PATH路径通过 Finder 查找](#PATH路径通过 Finder 查找)

[创建 Python 脚本 batch_optimize_glb.py](#创建 Python 脚本 batch_optimize_glb.py)

参数解释

执行py脚本运行优化命令

果实


前言

需要将n个glb模型文件在模型制作层面进行深度优化,此方案可将模型文件体积减少百分之50~90之间(具体优化幅度取决于模型贴图的尺寸及数量),效果显著,如下操作

用python脚本批量化的精简模型,具体精简模型在blender中的步骤是:

  • 导出glb模型的时候,在右侧面板 Material > Images 选项改为 JPEG Format(.jpg)
  • 导出glb模型的时候,在右侧面板 Material > Image Quality 由75改为30
  • 导出glb模型的时候,右侧面板 勾选 Compression 选项

配置Blender环境变量

javascript 复制代码
export PATH="/Applications/Blender.app/Contents/MacOS:$PATH"

PATH路径通过 Finder 查找

  1. 右键点击 Blender 应用图标 → 显示包内容

  2. 进入 Contents/MacOS 文件夹

  3. 在终端中复制完整路径:

javascript 复制代码
# 获取实际路径(拖拽 MacOS 文件夹到终端即可显示)
/Applications/Blender-4.1.app/Contents/MacOS

创建 Python 脚本 batch_optimize_glb.py

python 复制代码
import bpy
import os
from pathlib import Path

def optimize_glb(input_path, output_path):
    """处理单个GLB文件(仅优化不缩放)"""
    try:
        # 清除场景
        bpy.ops.wm.read_factory_settings(use_empty=True)
        
        # 导入GLB
        bpy.ops.import_scene.gltf(filepath=input_path)
        
        # 注释掉以下缩放相关的代码块 ▼▼▼
        # bpy.ops.object.select_all(action='SELECT')
        # bpy.ops.transform.resize(value=(scale_factor, scale_factor, scale_factor))
        # bpy.ops.object.transform_apply(scale=True)
        # 注释掉以上缩放相关的代码块 ▲▲▲
        
        # 准备导出参数
        export_params = {
            'filepath': output_path,
            'export_format': 'GLB',
            'export_yup': True,
            'export_apply': True,  # 仍然建议保留,确保应用其他变换
            'export_image_format': 'JPEG',
            'export_jpeg_quality': 30
        }
        
        # 版本兼容的压缩设置
        if bpy.app.version >= (4, 0, 0):
            export_params['export_draco_mesh_compression_enable'] = True
        else:
            export_params['export_compress'] = True
        
        # 导出GLB
        bpy.ops.export_scene.gltf(**export_params)
        return True
        
    except Exception as e:
        print(f"处理失败 {input_path}: {str(e)}")
        return False

def batch_process(input_dir, output_dir):
    """批量处理GLB文件(不缩放)"""
    input_dir = Path(input_dir)
    output_dir = Path(output_dir)
    
    # 统计变量
    total_files = 0
    success_count = 0
    size_reduction = 0
    
    print(f"\n{'='*50}")
    print(f"开始批量优化模型(不缩放版本)")
    print(f"输入目录: {input_dir}")
    print(f"输出目录: {output_dir}")
    print(f"{'='*50}\n")
    
    # 递归遍历所有子目录
    for glb_file in input_dir.rglob("*.glb"):
        relative_path = glb_file.relative_to(input_dir)
        optimized_path = output_dir / relative_path
        
        optimized_path.parent.mkdir(parents=True, exist_ok=True)
        
        total_files += 1
        print(f"[{total_files}] 处理: {relative_path}", end=" => ")
        
        if optimize_glb(str(glb_file), str(optimized_path)):
            # 计算体积变化
            orig_size = glb_file.stat().st_size / (1024 * 1024)
            new_size = optimized_path.stat().st_size / (1024 * 1024)
            reduction = (orig_size - new_size) / orig_size * 100
            size_reduction += reduction
            
            status = f"✓ (-{reduction:.1f}%)"
            success_count += 1
        else:
            status = "✕"
        
        print(status)
    
    # 打印报告
    avg_reduction = size_reduction / success_count if success_count > 0 else 0
    
    print(f"\n{'='*50}")
    print(f"处理完成")
    print(f"{'='*50}")
    print(f"扫描到GLB文件: {total_files}个")
    print(f"成功处理: {success_count}个")
    print(f"失败: {total_files - success_count}个")
    print(f"平均体积减少: {avg_reduction:.1f}%")
    print(f"{'='*50}")

if __name__ == "__main__":
    input_folder = "/Users/changchun/Downloads/usdz_to_glb"
    output_folder = "/Users/changchun/Downloads/usdz_to_glb_small"
    
    if not Path(input_folder).exists():
        print(f"错误:输入目录不存在 - {input_folder}")
        exit(1)
    
    batch_process(input_folder, output_folder)

参数解释

参数 作用 Blender 对应选项
export_image_format='JPEG' 纹理转为 JPEG 格式 Material > Images > JPEG
export_jpeg_quality=30 降低 JPEG 质量 Material > Image Quality = 30
export_compress=True 启用文件压缩 Compression 勾选

执行py脚本运行优化命令

javascript 复制代码
blender --background --python /path/to/batch_optimize_glb.py

果实

按此方案执行后,你的 GLB 模型将自动完成:

  • ✅ 纹理转 JPEG

  • ✅ 模型大小优化为 50~80%

  • ✅ 可选网格简化

相关推荐
ocean210318 小时前
2025-2026年Python大厂面试高频问题
python·面试·面试经验
xn713318 小时前
实测 Codex CLI 0.154.0:response.failed 为什么会被 idle timeout waiting for SSE 覆盖
python·openai
李高钢18 小时前
Python Flask 框架入门:从零搭建你的第一个 Web 应用
前端·python·flask
码农学院18 小时前
外贸独立站GEO实战:用 Python 自动生成多语言 llms.txt 和 Schema 站点地图
人工智能·python·chatgpt·geo·geo优化·ai优化aio
jsjzsl218 小时前
独立自由度框架下核聚变的本体论本质与商业化技术新路径
人工智能·python·算法
Thomas.Sir18 小时前
第45课:TensorFlow|异常检测实战【工业设备数据故障识别模型搭建】
人工智能·python·tensorflow
数商云企18 小时前
2026年西安电商智能客服开发选数商云企,技术稳交付快
大数据·python
Patrick在香港18 小时前
Python 分析香港 AQHI 归档 1644 天:同一天的空气,早上 8 点报 3,下午 5 点报 10
开发语言·python·数据分析·api·restful·数据可视化·开放数据
SamChan9019 小时前
Python批量处理PDF踩坑实录:中文编码、字体内嵌、多栏排版与内存占用
python·单片机·ai·pdf·机器翻译
3Q工具箱 - BraggTroy19 小时前
Python + PyInstaller 实战:从零打造 10 个 Windows 桌面小工具(附全部踩坑记录与核心代码)
开发语言·windows·python