两周前,我结束了一场12小时的打印。模型完美,但35%的耗材变成了垃圾——扭曲、断裂、被打磨掉的支撑结构,完成使命后立刻成为废料。
我玩了多年3D打印,知道支撑是"必要的恶"。但后来我注意到一件事:市面上所有切片软件——Cura、PrusaSlicer、OrcaSlicer、Bambu Studio——都用同一套算法决定支撑位置。一个简单的角度阈值。只要表面倾斜超过45°,就在下方铺满支撑。没有针对几何形状的智能判断,没有优化,只有蛮力。
于是我写了个工具,终于问对了问题。
架构很简单:纯命令行,输入标准STL文件,分析实际几何形状而非仅看表面角度,按区域生成优化支撑而非统一规则,输出能直接丢进任何切片器的STL。无数据库,无服务器,无网页界面。纯Python + numpy + trimesh。
流程是:STL输入 → trimesh网格 → 悬空检测(面法向量与Z轴点积)→ 严重程度分级(关键/中等/边缘)→ 孤岛检测(不连通区域的广度优先搜索)→ 按孤岛选择策略(树状/重接口/极简)→ 生成支撑几何 → 输出STL。
数学出奇地简单。我原以为需要神经网络,但仔细的几何分析解决了90%的问题。
核心思路:停止把所有悬空等同对待。主流切片器的秘密是:检查面法向量与垂直方向夹角是否超过45°,如果是,就在下方整个空间填满统一支撑材料。就这些。这套算法每年浪费数百万公斤塑料。
解决方法是把悬空当作光谱而非二元开关。旧算法:计算点积,小于cos(45°)就统一加支撑。更好的做法:按严重程度分类——点积小于-0.5的近乎水平朝下面为"关键",用密集接口;小于0.0的中等悬空用树状支撑;小于cos(45°)的轻微悬空用轻触式支撑;其余安全区域不加。46°的悬空和120°(几乎朝下)的悬空需求完全不同,传统切片器不区分,浪费就在这里。
我以为一个周末就能搞定。原型运行完美:检测悬空、分配策略、生成支撑柱。然后我用小船船体测试,它检测出83%悬空。船体大多是缓坡,不可能83%需要支撑。阈值没错,数学没错,但有些悬空面会桥接到其他面,下方其实不需要材料。
修复方案:孤岛检测。我实现了BFS遍历,识别真正需要独立支撑的不连通区域。这是关键——不是每个悬空面都需要支撑,只有那些"孤岛"才需要。
热门跟贴