<p>不能。.blend 是 Blender 自研二进制格式,无官方 C# API、无稳定文档结构,所有解析均为不可靠逆向工程;可行路径是通过 Blender 导出为 FBX/GLTF/OBJ 后用 C# 库加载。</p>

Blender .blend 文件能用 C# 直接解析吗? 不能。.blend 是 Blender 自研的二进制容器格式,含自定义内存布局、指针重定位、运行时压缩(LZ4)、版本兼容层,没有公开稳定 ABI,也**不提供官方 C# API 或文档化结构定义**。所有“解析”都是逆向工程结果,极不稳定。
你看到的某些 GitHub 项目(如 BlendNet、libblend-sharp)本质是 C 库(blender_source 中的 readfile.c / file_format.c)的非完整绑定,或仅支持极老版本(如 2.79),对 3.x/4.x 的 ID 数据块(Scene、Object、Mesh)解析基本失效。
C# 读取 .blend 中的模型/场景数据有哪些可行路径?
绕过直接解析 .blend,改用 Blender 提供的、稳定且面向外部的导出通道:
- 用 Blender 自身导出为通用中间格式:从 UI 或 Python 脚本调用
bpy.ops.export_scene.fbx、bpy.ops.export_scene.gltf 或 bpy.ops.export_mesh.obj
- 在 C# 侧加载导出后的
.fbx / .glb / .obj —— 有成熟库:AssimpNet(FBX/OBJ)、SharpGLTF(GLB/GLTF)
- 自动化流程:C# 启动 Blender 命令行(
blender.exe --background scene.blend --python export.py),由 Python 完成导出,C# 等待文件生成后读取
bpy.ops.export_scene.fbx、bpy.ops.export_scene.gltf 或 bpy.ops.export_mesh.obj
.fbx / .glb / .obj —— 有成熟库:AssimpNet(FBX/OBJ)、SharpGLTF(GLB/GLTF)blender.exe --background scene.blend --python export.py),由 Python 完成导出,C# 等待文件生成后读取注意:.blend 里可能含驱动、几何节点、着色器节点等逻辑,这些在 FBX/GLTF 中会丢失或降级为静态网格+贴图,不是“解析失败”,而是语义不可映射。
为什么别碰 .blend 解析库(尤其 NuGet 上的)?
常见错误现象:NullReferenceException 在读取 FileBlock 后、SDNA 结构偏移错位、PointerLink 解引用崩溃;
- 所有开源 .blend 解析器都卡在 “能读出文件头 + 少量 ID 名称”,无法可靠重建
Object 层级关系或 Mesh 顶点数据
- Blender 每次小版本更新(如 4.1 → 4.1.1)都可能微调
SDNA 字段顺序或添加 padding,导致解析器直接跳帧或读出乱码
- 没有官方维护者:GitHub 上 star 最多的 C# .blend 项目最后一次 commit 是 2020 年,对应 Blender 2.82
Object 层级关系或 Mesh 顶点数据SDNA 字段顺序或添加 padding,导致解析器直接跳帧或读出乱码如果你真需要运行时访问 .blend 内容(比如做插件预览),唯一靠谱做法是嵌入 Blender 的 Python 运行时(Python.NET + blender_python_embedded),但这就不是“C# 解析”,而是“用 C# 驱动 Blender 自己干活”。
导出 GLTF 时要注意哪些坑?
这是目前最平衡的方案(保材质、动画、层级,体积小,C# 生态好),但仍有细节易错:
- Blender 导出前必须设好单位:项目单位 →
Scale: 1.0,否则 SharpGLTF 读出的 Transform 会缩放异常
- 启用
Export Selected 时,确保要导出的对象已选中且未被隐藏(hide_viewport = False)
- 材质导出依赖
Image Texture 节点连接到 Base Color,若用程序化噪声纹理,GLTF 里只会存一个纯色 fallback
-
SharpGLTF 默认不读动画曲线,需手动调用 model.LogicalAnimations 并检查 Channel.Target.Path == "translation" 等
Scale: 1.0,否则 SharpGLTF 读出的 Transform 会缩放异常Export Selected 时,确保要导出的对象已选中且未被隐藏(hide_viewport = False)Image Texture 节点连接到 Base Color,若用程序化噪声纹理,GLTF 里只会存一个纯色 fallbackSharpGLTF 默认不读动画曲线,需手动调用 model.LogicalAnimations 并检查 Channel.Target.Path == "translation" 等真正难的从来不是“怎么读”,而是“读出来的东西是否和你在 Blender 里看到的一致”——.blend 不是数据库,它是 Blender 运行时快照,拿走一半,剩下一半就没了。










