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 模型提供了坚实基础。

屏幕不够,算法来凑(二):ESP32 单色屏上的 Ditherpunk 实战

屏幕不够,算法来凑(二):ESP32 单色屏上的 Ditherpunk 实战

0x00 序

上一篇文章中,我们在浏览器中通过 JavaScript 模拟了各种抖动算法的视觉效果。虽然原理通透了,但真正的挑战在于硬件端:如何在资源受限的嵌入式设备上复现这些效果?

本文将记录我基于 ESP32-S3 和一块 1.54 寸 ST7305 单色屏的实战过程,探讨如何在单片机上实现从基础的阈值法到复杂的误差扩散等多种图像处理算法。

阅读更多

DWM3001CDK点亮WS2812 RGB LED

背景

去年参加了FastBond的第四期活动, 为了能够白嫖到这块开发板子, 不得不掏出这块板子在Deadline之前完成一个项目.
看了下活动要求, 感觉点灯是最简单的. 不过既然点灯了, 就点个稍微有点难度的吧.
比如点亮能让性能增加200%的WS2812 RGB LED.

阅读更多