当前位置: 首页 > backend >正文

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

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

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("批量导出完成!")
http://www.xdnf.cn/news/12811.html

相关文章:

  • 【算法】【优选算法】优先级队列
  • Hermite 插值
  • Day47
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
  • 【CSS-6】深入理解CSS复合选择器:提升样式表的精确性与效率
  • 宝塔安装配置FRP
  • 【题解-洛谷】P10448 组合型枚举
  • 基于RAG实现下一代的企业智能客服系统
  • 2025年6月|注意力机制|面向精度与推理速度提升的YOLOv8模型结构优化研究:融合ACmix的自研改进方案
  • 当SAP系统内计划订单转换为生产订单时发生了什么?
  • 混合策略实现 doc-doc 对称检索局限性与失败案例
  • 基于算法竞赛的c++编程(21)cin,scanf性能差距和优化
  • 在 Windows 11 或 10 上删除、创建和格式化分区
  • tableau 实战工作场景常用函数与LOD表达式的应用详解
  • 操作系统进程管理解析:从 fork 到 exec 的全流程实战与底层原理
  • Python Robot Framework【自动化测试框架】简介
  • OTF字体包瘦身,保留想要的字
  • vector使用及模拟
  • python并发编程
  • 【AI系列】BM25 与向量检索
  • 并行硬件环境及并行编程
  • 【Java学习】Spring Security登录认证流程通俗版总结归纳
  • 【西门子杯工业嵌入式-4-什么是外部中断】
  • Cursor生成Java的架构设计图
  • 第二十六章 流程控制: case分支
  • 一键亮灯高级和弦触发自动鼓机:特伦斯自动挡钢琴开启音乐创作的全新时代
  • B站Miachael_ee——蓝牙教程笔记
  • 【论文解读】Toolformer: 语言模型自学使用工具
  • C++图书管理
  • MySQL 8.0 绿色版安装和配置过程