【Blender】Blender 基础:导入&导出

【Blender】Blender 基础:导入 & 导出

引言

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 中导入模型操作简单,但在实际工作中仍有几个关键细节需要注意:

  1. 确认单位和坐标系

    • Blender 默认单位为米,Z轴朝上;
    • 某些格式(如 FBX)可能使用厘米、Y轴朝上。
  2. 集合自动命名机制

    • Blender 会以文件名创建集合(Collection);
    • 子对象可能会被自动重命名(如重复 Mesh 名称)。
  3. 贴图路径处理

    • 如果路径是相对的,需保持贴图与模型结构一致;
    • 外部贴图缺失会导致材质白模。
  4. 动画数据载入

    • 格式如 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(并保留原文件命名)

python 复制代码
import bpy
import os
import glob

def 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 = filename
    else:
        # 如果有多个顶层对象,可以创建一个空的根对象命名
        parent = bpy.data.objects.new(filename, None)
        new_col.objects.link(parent)
        for obj in root_objects:
            obj.parent = parent

    print(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

python 复制代码
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'].objects

for 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 + textures
            export_apply=True
        )

print("批量导出完成!")
相关推荐
渲染101专业云渲染5 天前
Blender 云渲染高效流程:渲染 101 集群加速实战
服务器·分布式·blender·maya·houdini
fcm197 天前
blender 导入的fbx模型位置错乱
blender
阿拉丁的梦8 天前
【3D大比拼第一集】--max,maya,c4d,blender的命令搜索功能
blender·maya
BJ_bafangonline10 天前
如何更改Blender插件安装位置呢?
blender
小赖同学啊11 天前
将Blender、Three.js与Cesium集成构建物联网3D可视化系统
javascript·物联网·blender
远离UE413 天前
blender uv小技巧
blender·uv
在下胡三汉20 天前
3dmax一键烘焙很多张贴图合并成一张贴图插件支持fbx/obj/blender多材质模型合并为一张贴图
blender·材质·贴图
九河_22 天前
【blender】使用bpy对一个obj的不同mesh进行不同的材质贴图(涉及对bmesh的操作)
blender·材质·贴图·bpy
渲染101专业云渲染1 个月前
云端算力革命:川翔云电脑如何重新定义创作自由
云计算·电脑·blender·maya·houdini
3D虚拟工厂1 个月前
3D虚拟工厂
3d·vue3·blender·数字孪生·three.js