lib3mf 集成系列(一):编译与示例测试

背景

学习flutter有半个月了, 看Flutter实战看得看不下去了, 打算写点东西练练手.
又不想写基础的UI界面, 所以想试试Flutter FFI, 以及和安卓原生的交互, 再牵涉到一些OpenGL的渲染.
于是就有了此文.
本文是系列文章的一部分, 主要记录如何编译lib3mf, 以及基础用法.
为保证环境一致, 编译时基于9ada20e4287fec118a29d5643f5714ea68302e21 (master分支当时的最新提交)

3mf文件介绍

3MF(3D Manufacturing Format)是一种专为3D打印设计的开放式、基于XML的文档格式,旨在解决STL等传统格式信息缺失的问题。它能在一个压缩文件中完整描述模型几何形状、颜色、材质、支撑和打印参数,2025年已成为国际标准(ISO/IEC 25422:2025)。

lib3mf介绍

lib3mf 是一个开源的 C++ 库,用于读写 3MF 文件。它提供了 3MF 文件的完整实现,包括 3MF 核心规范以及所有相关的扩展。

准备工作

下载源码

1
2
git clone https://github.com/3MFConsortium/lib3mf.git
git submodule update

编译

1
2
3
4
mkdir build
cd build
cmake ..
make

成功编译后, 生成的文件位于build目录下, 包含lib3mf.2.dylib等依赖库.

编译SDK/EXample/CPP

lib3mf 的 C++ 示例程序涵盖了从基础几何体生成到高级扩展(如点阵、切片、加密)的应用场景。

直接编译会提示缺少头文件和库文件, 需要修复CMakeLists.txt文件.

修复CMakeLists.txt内路径错误

主要是路径错误, 直接编译报找不到lib3mf_implicit.hpp和lib3mf库找不到问题, 需要手动修复include_directorieslink_directories等路径.
后面我编译的是CPP目录下的Example, 所以路径修改如下:

1
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../Bindings/Cpp)
1
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../Autogenerated/Bindings/Cpp)
1
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../Bin)
1
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../build)
1
add_custom_command(TARGET ${MyTarget} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../../Bin/lib3mf.${LSUFFIX}" $<TARGET_FILE_DIR:${MyTarget}>/lib3mf${LSUFFIXOUT})
1
add_custom_command(TARGET ${MyTarget} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../../../build/lib3mf.${LSUFFIX}" $<TARGET_FILE_DIR:${MyTarget}>/lib3mf${LSUFFIXOUT})

再次编译

再次make得到可执行文件

1
2
3
4
5
6
❯ ls                 
CMakeCache.txt Example_Components Example_SecureCube GenerateVS2017.bat lib3mf.2.dylib
CMakeFiles Example_Converter Example_Slice GenerateVS2019.bat
CMakeLists.txt Example_Cube Example_TextureCube Makefile
Example_BeamLattice Example_ExtractInfo GenerateMake.sh Source
Example_ColorCube Example_FillMeshWithGyroid GenerateVS2015.bat cmake_install.cmake

运行Example_ColorCube得到了一个colorcube.3mf, 原来这是生成3mf文件的例子
使用Bambu Studio打开后预览模型
Color Cube Preview
发现不是立方体, 但是不知道为啥例子叫做Cube, 而且没有颜色.
为了验证颜色, 使用MeshLab打开正确识别到了颜色
Color Cube Preview

lib3mf 示例程序 (CPP) 运行报告

前面步骤编译出了所有的Example可执行文件, 索性在这里记录下所有的Example的功能, 以及在不同查看器中的表现.

1. 基础模型与转换

示例名称 功能描述 兼容性与备注 预览图
Cube 普通长方体模型 最基础的几何体生成示例。
ColorCube 彩色长方体 演示如何为模型添加颜色属性。
Components 对象复用特性 生成多个不同位置的长方体,支持导出 STL/3MF。
Converter 格式转换 实现 3MF ↔ STL 的双向转换。 -
ExtractInfo 信息提取 从 3MF 文件中读取并打印模型元数据。 -

2. 复杂结构与兼容性分析

针对 3MF 高级扩展(Lattice)的专项测试:

示例名称 核心原理 查看器表现 (Bambu Studio/ MeshLab / 3mfViewer) 预览图
BeamLattice 基于“梁”单元(Beam Lattice)的框架。 Bambu Studio打不开;MeshLab仅显轮廓;3mfViewer支持良好。
FillMeshGyroid 数学公式生成的 Gyroid 陀螺面点阵。 Bambu Studio/3mfViewer均无法打开。 -

3MF 并非单一标准,它由 Core Spec 和多个 Extensions 组成, 不同切片软件可能会按需实现Extensions。


3. 功能扩展示例

  • Slice (内置切片)
    • 功能: 生成包含内置切片信息的 3MF 文件。
    • 表现: Bambu Studio 忽略了此信息;但在 3mf Viewer 中,右侧会出现专用的 Slice 滑动条供逐层观察。
  • SecureCube (安全扩展)
    • 功能: 演示 3MF 的安全内容扩展(如加密、数字签名)。
    • 状态: 暂未深入研究。

为 Flutter FFI 做准备

在进入下一篇之前,我们需要确认编译出的动态库是否符合 FFI 调用要求。

检查导出符号

使用 nm -gU lib3mf.2.dylib 检查。lib3mf 提供了专门的 C-Wrapper,这对于 Flutter(仅能直接调用 C 风格接口)至关重要。

1
2
3
4
5
6
7
8
❯ nm -gU lib3mf.2.dylib 
00000000001abe30 T _lib3mf_accessright_getconsumer
00000000001ac8ec T _lib3mf_accessright_getdigestmethod
00000000001ac54c T _lib3mf_accessright_getmgfalgorithm
00000000001ac1b4 T _lib3mf_accessright_getwrappingalgorithm
00000000001e09fc T _lib3mf_acquire
000000000016c3fc T _lib3mf_attachment_getpath
...

Handle 机制

lib3mf 使用句柄(Handle)管理对象,这意味着在 Flutter 侧我们需要维护一套指针映射,防止内存泄漏。

总结

本文完成了 lib3mf 的环境搭建与功能验证。虽然部分高级扩展在商用切片软件中兼容性不佳,但 lib3mf 强大的 C-API 为我们在 Flutter 中操作 3D 模型提供了坚实基础。

lib3mf 集成系列(一):编译与示例测试

https://chaosgoo.com/01-compile-lib3mf-and-examples/

作者

Chaos Goo

发布于

2026-03-03

更新于

2026-03-03

许可协议