非平面切片与真 3D 路径
结论先行:把切层方向从固定的
[0,0,1]松开,90° 悬挑就不需要支撑了 —— 因为每一层都能压在上一层上。 代价是碰撞、Z 单调、层厚一致性全部要自己管。落地有两条现实路径: 一是后处理改切片产物(不改硬件,当天能试),二是两段式(主体标准切片 + 顶面二次成型),后者材料 +9% 而时间 −9%。
一、为什么换了切层方向就能免支撑
平面切片的三轴打印有一条硬约束:每一层都必须是水平面,层法向固定为 [0,0,1]。于是当零件表面接近竖直(悬挑接近 90°)时,上下两层在水平方向的接触宽度趋近于零 —— 每层只搭住上一层的极小一条边,重力一拉就掉,必须加支撑。
非平面切片的做法是让层平面随表面倾斜:
平面切片(层法向 = [0,0,1]) 非平面切片(层法向随曲面转)
──────── ← 每层水平 ╱╱╱╱ ← 层沿曲面切向堆叠
──────── ╱╱╱╱
──────── ╱╱╱╱
悬挑面越陡,接触宽度越小 每条挤出线压在相邻线的侧上方
→ 支撑必需 → 90° 悬挑也能自承
几何上的关键是接触宽度的定义变了:平面切片里接触宽度是「同一条竖直线上的重叠」,非平面里接触宽度是「相邻两条挤出线之间的侧向搭接」。后者只要线间距小于线宽就存在,与表面倾角无关。这就是「免支撑做 90° 悬挑」的全部机理。
源页把这条路线拆成四项技术:
| 技术 | 含义 | 落地难度 |
|---|---|---|
| 90° 悬挑无支撑 | 在三轴机上用非平面切片实现 | 中(受碰撞与 Z 单调限制) |
| 阳台悬挑(Balcony Overhang) | 逐层偏移,让每层向外延伸一小段,形成外扩结构 | 低(可后处理实现) |
| 子体积分割 | 同一零件分区域用不同切片策略(一部分平面、一部分非平面) | 中(需要分区与拼接) |
| 平面切片器模拟非平面 | 用 Cura / PrusaSlicer 的后处理做出非平面效果 | 最低 |
力学上的收益不止「省支撑」:
- 层间粘接方向可控 —— 层界面不再一律水平,可以把界面转到受力较小的方向,把应力分散掉;
- 连续纤维可沿受力方向铺设,这在纤维增强材料上比几何精度更值钱;
- 外形与表面直接对齐,曲面零件没有台阶纹,省掉后处理打磨。
代价同样明确:层厚在倾斜面上会沿实际法向变化,挤出量必须跟着变;喷嘴与已打印部分存在干涉风险;三轴机上 Z 必须单调,不能下探。这三条决定了非平面只能在「斜率受限 + 单向前进」的范围内用。
层厚为什么会随倾角变化
设切片层厚(垂直方向)为 t,表面与水平面夹角为 α,则沿表面法向的真实层厚是:
t_eff = t / cos α
| 表面倾角 α | 1/cos α |
相对挤出量 | 说明 |
|---|---|---|---|
| 0°(水平顶面) | 1.00 | 1.0× | 正常顶面 |
| 30° | 1.15 | 1.15× | 基本无感 |
| 45° | 1.41 | 1.41× | 需开始降速 |
| 60° | 2.00 | 2.0× | 流量翻倍,多数热端到顶 |
| 75° | 3.86 | 3.9× | 已超出常规流量能力 |
| 85° | 11.47 | 11.5× | 模型失效 |
这张表说明两件事。第一,「层厚不变」在倾斜面上是假的:垂直层厚固定 0.2 mm、表面 60° 时,法向层厚是 0.4 mm,挤出量必须翻倍,否则欠挤出。第二,当 α 趋近 90° 时这个模型自己崩掉(1/cos α → ∞),说明「靠加大挤出量维持层厚」这条路在竖直面上走不通。90° 悬挑必须靠另一套机制:相邻挤出线的侧向搭接,也就是非平面切片把层平面转到接近竖直、让每条线压在邻线侧上方。这两套机制的分界大概在 α = 60–70° 之间 —— 再往上就该换模型,而不是继续加流量。
二、开源方案盘点:四条路线,63 个项目
对 GitHub 做了四轮检索(60+ 组检索词、去重 730 个仓库)后,能真正生成 3D 路径的项目有 63 个,按落地难度分成四条路线:
| 路线 | 代表项目 | 门槛 | 适用场景 |
|---|---|---|---|
| ① 后处理变形派(不改硬件、不换切片器,把平面 G-code 变成非平面) | NonPlanarInfill、GCodeZAA、Fuzzyficator、RotBotSlicer-Nonplanar_Slicing | 最低,现有三轴机直接跑 | 快速验证、曲面外观件 |
| ② 独立非平面切片器(三轴机打曲面层) | CurviSlicer(Inria)、AtomSlicer、atomizer、MageSlicer | 中,多为论文参考实现 | 曲面分层、研究中试 |
| ③ 多轴 / 机器人切片(4–6 轴真 3D 自由度) | Open5x、S³-Slicer、ORNLSlicer、NEPath、Fractal-Cortex | 最高,但最贴近工业落地 | 机械臂打印、大幅面构件 |
| ④ 体积层析(彻底脱离「层层」) | drtvam(EPFL)、CAL-software、SwissVAMyKnife.jl | 高,属另一条技术线 | 与光固化/体积成型同源 |
最值得先读的八个(星数为调研当天口径):
| 项目 | ★ | 为什么值得看 |
|---|---|---|
TengerTechnologies/Bricklayers |
2201 | 社区最热的非平面后处理:交错内壁抬升半层,装上就能试 |
FreddieHong19/Open5x |
1186 | 三轴机改五轴的完整开源标杆(Duet3D 平台,FormNext 展出过) |
FullControlXYZ/fullcontrol |
1006 | Python 全控制路径框架,这一派的事实标准 |
AndyGlx/FullControl-GCode-Designer |
594 | 同系 VBA 版设计器,老但可直接参考参数化出码 |
mfx-inria/curvislicer |
260 | Inria 曲面层切片,三轴机可用,有论文 + 代码 |
zhangty019/S3_DeformFDM |
175 | SIGGRAPH Asia 最佳论文,通用多轴切片框架(支撑自由 / 强度 / 表面质量统一) |
ORNLSlicer/ORNLSlicer |
93 | 国家实验室级工业切片 + 路径规划框架,长期活跃 |
WangY18/NEPath |
70 | IQOP 非等距路径 + 连通费马螺旋,也是「等值线零空移」那条路线的权威出处,Boost 许可可商用 |
另有 xavierchermain/atomizer(39★)走「用 atoms 替代切片」的路子,无碰撞紧贴几何,SGP 荣誉提名 —— 思路值得读,但离产品很远。
三、后处理变形派:门槛最低的那条
这一派的共同点是输入是普通切片器出的平面 G-code,输出是变形后的非平面 G-code,不需要换主板、换固件、换切片器。
| 做法 | 机制 | 效果 |
|---|---|---|
| 交错内壁抬升半层 | 把内壁路径在 Z 上偏半层,使内壁与外墙错位 | 层界面错开,侧向强度提升 |
| 路径 Z 调制 | 按表面高度函数改写每条路径的 Z | 顶面随形,消除台阶 |
| 逐层偏移(阳台悬挑) | 每层向外偏一小段,累积成外扩 | 局部悬挑不再需要支撑 |
优点是当天能跑;缺点是只能改 Z,改不了拓扑 —— 它无法把一段路径掰成真正垂直于当前的曲面层,只是把平面路径「抬起来」。而且适配性依赖固件与切片器版本,必须实机验证后再信。
如果目标只是「曲面外观 + 少支撑」,这一派够了;如果要真正在接近竖直的面上做多层堆叠,就必须换到路线 ②③,或者用下面的两段式。
四、两段式:主体标准切片 + 顶面二次成型
这是把「非平面」压缩成一个可交付工程问题的最省钱做法。核心思路:不去改切片器,而是把零件拆成两段,界面做成平面贴平面。
z = 88.1 mm ┬─ 顶部随形网格层(底平顶曲的过渡块,TPMS 立体填充)
│ 无外墙 / 无顶底 / 网格上表面 = 原模型顶面
z = 38 mm ├─ 对接面(平面贴平面,两段各切各的,此处合并)
│ 主体(标准平面切片,普通外墙 + 填充)
z = 0 ┴─ 模型底面
总高不变、总层数不变(45 层),改动只发生在 38–88 mm 这 50 mm 的填充方式上。四步流程:
- 提取顶面曲面:从模型上方打 16,074 条射线,命中 16,034 条 ⇒ 得到
f(x,y),值域 54.1–88.1 mm(起伏 34 mm); - 造「底平顶曲」过渡块:底面取 z = 38 平面、顶面取
f(x,y)、侧壁封边 ⇒ 32,068 顶点 / 64,132 面,水密判定通过,体积 5,130 cm³(分界线先取 39.1,后对齐到层高网格取 38); - 网格块切片:无外墙、无顶底、TPMS 立体网格填充;
- 两段合并:主体截到 z = 38,接网格段,自动补 Z 偏移、重编层号。
实测产物:45 层 / 53 MB / 回抽 50 次 / G0 45 次 —— 注意 G0 正好等于层数,说明这是「一层一次跳转」的标准切片节奏,不是连续路径。
用量对照很反直觉:
| 段 | 高度范围 | 线材 | 时间 |
|---|---|---|---|
| 主体(标准切片) | 0–38 mm | 455.3 m | ≈ 11.5 h |
| 顶部随形网格(TPMS) | 38–88 mm | 436.6 m | ≈ 11.1 h |
| 合计 | 0–88 mm | 891.9 m | ≈ 22.6 h |
| 对照:整件标准切片 | 0–88 mm | 815.7 m | 24.8 h |
材料多 9%,时间反而少 9%。 原因很直接:顶部换成网格后实心体积下降,但网格路径更密、单段更短,机器几乎不空跑 —— 省下的时间来自「没有大段空移」。这条结论对成本敏感的大件很有用:填充策略的改动可以同时买到外观和节拍。
为什么界面必须是平面
源页在结构图上专门标了「关键:界面是平面贴平面」。这不是排版讲究,而是两段能合并的前提:
- 界面若是平面,两段在同一 Z 上共享完全相同的截面轮廓,合并时只需对齐 XY 原点与 Z 偏移,接缝处的线宽与层高天然一致;
- 界面若是曲面,两段各自切出来的层轮廓在界面层上不重合,接缝处必然出现重叠(过挤)或空隙(冷缝),而且偏移量随位置变化,无法用一个常数修正。
由此可以把这个做法泛化:任何「局部需要非平面」的需求,都可以拆成「平面界面 + 局部二次成型」 —— 主体走成熟切片器,只有需要随形的那一段自己造几何。这条思路把非平面从「换一个切片器」降级成「多切一次 + 合并一次」,是它最实际的工程价值。
四个实测坑
| # | 坑 | 表现 | 修法 |
|---|---|---|---|
| 1 | 网格块不水密 | 切片器直接报 Polygonal slicer failed to complete due to errors in the mesh |
顶点必须按「网格点」共享,不能每个格子独立造顶点 |
| 2 | 切片器把模型沉到床上 | 切出来的 Z 从 2 开始而不是 38 | 从头部 o X … Y … Z <dz> 行读出偏移再补回(本例 +38.000 mm),否则两段错位 |
| 3 | 两段层号都从 0 开始 | 查看工具串层 | 第二段层号接续重编(本例 +19) |
| 4 | 预览器按距离抽稀 | 正确路径显示成「一堆大直线」 | 抽稀只允许发生在层间,层内保留全部细节 |
第 4 条是最贵的一课:TPMS 的真实段长中位数只有 0.55 mm,按 min_len 25 抽稀后相邻点被并成 25 mm 直线,于是被判定「路径完全是错的」。错在预览器,不在路径。 判据还是段长分布:中位数 / p99 / max 三个数一列出来,真假立辨。
还有一个隐藏坑:切片器只在 Z 变化时输出 Z 字,解析时必须继承上一个 Z,否则平面层会丢掉绝大部分点(实测丢失 97%)。
目前暴露的真实问题
TPMS 在曲面变换后局部过密:120×120 mm 窗口单层就有 24,000 段,估算线间距平均 1–2 mm,但波谷处不足 0.4 mm —— 小于喷嘴宽度,实际打印会糊在一起。
解法是调 TPMS 单元尺寸(各向异性单元尺寸参数 ui_cell_side_ratio_xy_z)或降填充密度,把最小间距拉到 ≥ 0.8 mm。这条阈值可以当作所有立体网格填充的通用下限:最小线间距 ≥ 2 × 喷嘴宽度。
五、Universal slicing 框架:理论坐标与适用边界
把这堆做法收进一个坐标系,最省事的框架是两级分类:
| 级别 | 切片路径方向 | 切片几何 | 层厚 |
|---|---|---|---|
| Class 1 | 静态 [0,0,1] |
平面或非平面(任意几何体) | 固定 |
| Class 2 | 可变(弯曲 / 过渡) | 可变(平面 ⇄ 非平面) | 可变 |
Class 1 里再按几何体细分为八类:平面、半球凸、半球凹、锥面(用于旋转倾斜喷嘴)、贝塞尔曲线波浪、NURBS 波浪、倾斜平面(传送带打印机的 45° XY)、点状凸起。
这个框架的价值在于把「非平面」从一种技巧变成一组可命名的几何体。对应到具体实现:
| 切片器 / 方案 | 支持级别 | 来源 |
|---|---|---|
| MetatronSlicer | Class 1 + 2 | 自研(xyzdims) |
| EnochSlicer | Class 1 + 2 | 自研(xyzdims) |
| DotXControl | Class 1 + 2 | 商用 |
| Ai Build | Class 1 + 2 | 商用(需 NDA) |
| Slicer4RTN | 锥面切片 | 旋转倾斜喷嘴专用 |
对挤出式打印的适用边界,要分清三件事:
- 它是分类学,不是工艺模型。 框架只回答「层方向怎么变、几何怎么变、层厚怎么变」,不含流量、压力、层间粘接、材料开放时间这些挤出式打印的实际约束。落进工程必须自己补上「层厚 → 挤出量」的映射。
- Class 1 静态方向可以在三轴机上真跑,只要 Z 单调、无碰撞;这是唯一不需要额外轴的自由度。
- Class 2 可变方向几乎必然要多轴。三轴机只有一个 Z,层方向一变就意味着要么 Z 不单调(不可能),要么把变化摊到 XY 上做近似(会牺牲层厚一致性)。锥面切片之所以需要「旋转倾斜喷嘴」,就是这条几何约束的直接后果。
对照一下混凝土打印的诉求就更清楚:非平面切片让悬挑不需要支撑,可变层厚让精细区密、填充区粗,多轴路径才能覆盖真正的空间曲面 —— 三条都落在这个框架里,但三条都需要比三轴更多的自由度,或者像两段式那样把非平面压缩成一个局部问题。
六、选型判据
| 你的情况 | 选哪条 | 理由 |
|---|---|---|
| 只想消掉顶面台阶,机器是三轴 | 后处理变形派(Bricklayers / Fuzzyficator / GCodeZAA) | 不改硬件,当天验证 |
| 曲面零件、顶面质量优先、可接受两段拼接 | 两段式(主体 + 顶面二次成型) | 界面是平面贴平面,最可控;材料 +9% / 时间 −9% |
| 零件有接近竖直的外壁、要求无支撑 | 独立非平面切片器(CurviSlicer 一类) | 需处理碰撞与 Z 单调 |
| 大幅面建筑构件、机械臂可用 | 多轴/机器人切片(Open5x、ORNLSlicer、S³-Slicer) | 唯一能覆盖真 3D 自由度的路线 |
| 需要真正脱离层层堆叠 | 体积层析(drtvam 一类) | 另一条技术线,与光固化同源 |
| 层间强度是主要指标 | 连续路径 + 空间填充曲线 | 见 连续路径生成 |
三条工程红线,任一条不满足就不要上非平面:
- Z 必须单调(三轴机)—— 任何需要下探的层方向都是不可实现的;
- 最小线间距 ≥ 2 × 喷嘴宽度 —— 曲面变换会压缩局部间距,波谷最先糊;
- 层间水平偏移不得超过丝宽 3–5 倍 —— 参数化路径里振幅 30 × 波数 14 × 层高 4 的组合,相邻层局部偏移可达十几毫米,远超挤出悬垂极限,必须限幅限速。
七、诚实边界
- 开源生态里绝大多数是研究原型,不是产品。多轴/机器人项目多数是论文参考实现,「能跑」不等于「能上产线」,别按产品预期排期。
- 星数与活跃度是调研当天抓取的口径,会变。
- 两段式的用量数据来自单件实测(枕形件),换几何、换填充形态后比例会变,但「网格替代实心能省时间」的机制不变。
- TPMS 局部过密的问题在源头仍未定案 —— 单元尺寸、网格层厚度、网格形态三个参数需要一起定,最小间距 0.8 mm 是当前的下限约束。
- 后处理派的适配性依赖固件与切片器版本,需实机验证后再信。
相关阅读
- 无法回抽材料的连续路径生成 —— 一条线到底的约束、拐角处理与段数压力
- 挤出流量与熔化能力 —— 层厚与线宽变化如何折算成流量
- 熔化区长度与流量天花板 —— 大流量下的热学上限