【Blender】Blender 基础:导入导出
【Blender】Blender 基础:导入 & 导出
- 引言
- 一、Blender 支持的主要格式
- 二、模型导入流程
- 三、模型导出逻辑
- (一)导出前准备:
- (二)导出选项控制(以 glTF 为例):
- 四、平台适配建议
- 五、常见问题与排查建议
- 六、使用Python代码批量导入glb(并保留原文件命名)
- 七、使用Python代码批量导出glb
引言
Blender 是一款强大的开源 3D 建模与渲染工具,在实际项目中,我们往往需要与外部工具或平台对接三维数据。这使得“导入”和“导出”成为 Blender 使用中的基本且关键的环节。
本文将系统讲解 Blender 中模型的导入与导出流程,覆盖支持的常见格式、注意事项以及适配不同平台的实践建议。
一、Blender 支持的主要格式
操作 | 常见格式 | 用途 |
---|---|---|
导入 | .obj 、.fbx 、.gltf/.glb 、.dae 、.stl 等 | 从 CAD、Maya、3ds Max、Unity 等迁移 |
导出 | .fbx 、.gltf/.glb 、.obj 、.stl 等 | 用于游戏引擎、Web 显示、3D 打印 |
✅ 推荐使用
.glb
或.gltf
格式导出,用于 Web 和实时场景,支持贴图、动画、材质完整性强。
二、模型导入流程
Blender 中导入模型操作简单,但在实际工作中仍有几个关键细节需要注意:
-
确认单位和坐标系:
- Blender 默认单位为米,Z轴朝上;
- 某些格式(如 FBX)可能使用厘米、Y轴朝上。
-
集合自动命名机制:
- Blender 会以文件名创建集合(Collection);
- 子对象可能会被自动重命名(如重复 Mesh 名称)。
-
贴图路径处理:
- 如果路径是相对的,需保持贴图与模型结构一致;
- 外部贴图缺失会导致材质白模。
-
动画数据载入:
- 格式如 FBX、GLTF 会同时载入骨骼与动画轨迹;
- 可在时间轴中直接预览。
三、模型导出逻辑
在导出模型时,我们需要明确目标平台的要求,比如是否需要压缩、是否保留动画、贴图格式等。
(一)导出前准备:
-
应用变换(Apply All Transforms):
- 保证模型位置、旋转、缩放一致性;
-
合并对象(如有需要):
- 合并子部件为整体模型,避免碎片;
-
清理材质槽与无用数据块:
- 精简模型数据结构。
(二)导出选项控制(以 glTF 为例):
选项 | 说明 |
---|---|
导出格式 | .glb (二进制)或 .gltf (JSON + Bin + 图片) |
压缩方式 | 支持 Draco 压缩(减少顶点数据体积) |
材质设置 | 保留 Base Color、Metallic、Roughness、法线贴图等 |
动画设置 | 可勾选导出动作(Action)与骨骼结构 |
四、平台适配建议
不同应用场景,对模型导出有不同的要求:
应用场景 | 推荐格式 | 关键配置 |
---|---|---|
WebGL / Three.js / Cesium | .glb (含 Draco) | 保留贴图、压缩顶点数据 |
Unity / Unreal Engine | .fbx | 应用变换,保留骨骼动画 |
3D 打印 | .stl / .obj | 删除材质,闭合网格,检查法线 |
医学三维重建 | .glb / .obj | 精简材质结构,保留关键模型结构 |
五、常见问题与排查建议
问题 | 原因 | 建议 |
---|---|---|
导入后模型尺寸异常 | 单位不一致 | 检查单位设置,统一为米 |
模型显示为纯白 | 材质或贴图未绑定 | 检查贴图路径,确认贴图存在 |
对象名称混乱 | 自动重命名 | 导入后手动重命名或脚本统一命名 |
动画丢失 | 未导出动画轨迹 | 导出前确认勾选动画选项 |
导出文件过大 | 面数多、贴图大 | 结合简化模型和压缩贴图处理 |
六、使用Python代码批量导入glb(并保留原文件命名)
import bpy
import os
import globdef import_gltf_strict_named(filepath: str):"""导入一个 glb 文件,将顶层对象命名为文件名,并放入同名集合"""filename = os.path.splitext(os.path.basename(filepath))[0]# 记录导入前所有对象existing_objects = set(bpy.data.objects)# 执行导入bpy.ops.import_scene.gltf(filepath=filepath)# 记录导入后新增对象imported_objects = [obj for obj in bpy.data.objects if obj not in existing_objects]# 获取场景中刚导入的顶级对象root_objects = [obj for obj in imported_objects if obj.parent is None]# 创建集合(名字与文件名相同)new_col = bpy.data.collections.new(filename)bpy.context.scene.collection.children.link(new_col)# 将所有导入对象放入新集合,清理原集合引用for obj in imported_objects:for col in obj.users_collection:col.objects.unlink(obj)new_col.objects.link(obj)# 如果只有一个顶层对象(比如是个 Group),重命名它if len(root_objects) == 1:obj = root_objects[0]if obj.name != filename and not bpy.data.objects.get(filename):obj.name = filenameelse:# 如果有多个顶层对象,可以创建一个空的根对象命名parent = bpy.data.objects.new(filename, None)new_col.objects.link(parent)for obj in root_objects:obj.parent = parentprint(f"✅ 已导入并命名:{filename}")def batch_import_glb_strict(folder_path: str):files = glob.glob(os.path.join(folder_path, "*.glb")) + \glob.glob(os.path.join(folder_path, "*.gltf"))print(f"发现 {len(files)} 个模型文件")for i, file in enumerate(files):print(f"[{i+1}/{len(files)}] 正在处理:{file}")import_gltf_strict_named(file)# 执行导入# 这里修改导出地址
folder_path = r"F:\project\"
batch_import_glb_strict(folder_path)
七、使用Python代码批量导出glb
import bpy
import os# 设置导出目录
export_dir = "G:\\new\\models" # 修改为你自己的导出路径# 创建导出目录(如果不存在)
if not os.path.exists(export_dir):os.makedirs(export_dir)# 取消所有选择
bpy.ops.object.select_all(action='DESELECT')# 获取所有要导出的对象(例如:位于指定 Collection 中)
objects_to_export = bpy.context.scene.objects # 或用:bpy.data.collections['YourCollection'].objectsfor obj in objects_to_export:if obj.type == 'MESH':# 仅选择当前对象bpy.ops.object.select_all(action='DESELECT')obj.select_set(True)bpy.context.view_layer.objects.active = obj# 设置导出路径和文件名export_path = os.path.join(export_dir, f"{obj.name}.glb")# 导出为 glTF/glb 文件bpy.ops.export_scene.gltf(filepath=export_path,use_selection=True,export_format='GLB', # 改为 'GLTF_SEPARATE' 可导出 .gltf + .bin + texturesexport_apply=True)print("批量导出完成!")