目录
[PATH路径通过 Finder 查找](#PATH路径通过 Finder 查找)
[创建 Python 脚本 batch_optimize_glb.py](#创建 Python 脚本 batch_optimize_glb.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 查找
-
右键点击 Blender 应用图标 →
显示包内容
-
进入
Contents/MacOS
文件夹 -
在终端中复制完整路径:
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%
-
✅ 可选网格简化