为什么 LLM 给的 STL 还打不出来?3D 打印文件格式与切片入门

资深 AI 读者大概已经熟悉 source vs. compiled artifact 的分层:源代码、IR、目标二进制层层递进,每一层都有自己的可验证性。3D 打印的链路恰好就是这条结构的一个具象——模型在不同阶段会以不同文件形态出现,每一层有自己的「编译产物」、也有自己的「验收门」。这一篇不演示具体按键操作,而是把这条接力跑道从头搭起来,让读者带着「我向 GPT 要模型时,它停在第几层」这个问题推进。 PrimitiveCAD

一、模型在被打印之前,到底变了多少次「文件」?

最常见的直觉是「3D 模型 = 一个 .stl 文件」——但这只对了一半。一份设计从想法到实物,至少要穿过四层文件,每一层都丢掉一些东西、又补上另一些东西: STL

第一层是可编辑源文件:Blender 的 .blend、CadQuery 的 Python 脚本、FreeCAD 的 .FCStd 都属于这一类。源文件包含设计历史或参数定义,改一处尺寸时依赖历史自动跟随——这是后面讲「Blender vs 参数化 CAD」时的关键概念。 FreeCAD

第二层是模型交换文件,也就是要让别的软件读到的格式。常见的有 STL、3MF、STEP(AP242)三种。它们的设计意图完全不同:

  • STL 1987 年由 3D Systems 发布,纯三角面顶点流,不存单位、不存颜色、不做拓扑校验。Prusa Blog 把 STL 钉死在「raw, unstructured, triangulated surface」上,认为它缺少尺度、颜色、材料信息,也允许出现 holes、non-manifold edges、flipped normals 等问题。3MFFormat
  • 3MF 是 2015 年由 3MF Consortium 发布的现代格式,物理层是 ZIP 容器,逻辑层遵循 OPC(Open Packaging Conventions),内含 XML 格式的 3D Model part 与 PrintTicket、缩略图、Core Properties 等元数据 part。规范 v1.3.0 强制 mesh 满足 manifold edges、consistent orientation、outward-facing normals 三条 MUST,且 <model unit> 属性显式声明单位(默认毫米)。这是 STL 完全做不到的。

下图来自 3MF Core 规范本身,给出 3MF Document 典型 OPC 包结构: ZIP

图注:3MF 文档是 ZIP+OPC+XML 复合包。OPC Root 通过多条 relationship 把缩略图、核心属性、签名、自定义 part 与 3D Payload(以 3D Model 为根,附带 PrintTicket、Object Thumbnail、3D Texture)组合起来。它不是一种新的 mesh 格式,而是 mesh + 元数据 + OPC 容器的复合。3MFCore

  • STEP 走另一条路,是 ISO 10303-242(2025 年发布 Ed4,64 页)的工程几何边界表示(B-Rep),同时可携带曲面、装配关系、运动学、复合材料铺层等多类工程数据。但要注意:STEP 跨 CAD 重建时不一定保留参数化历史——OCCT 默认读 AP214/AP203,对 AP242 是「部分支持」,kinematics、PDM、supplemental geometry 在多数 kernel 上未必落到本地 feature tree。STEPAP242

第三层是切片项目,主流格式就是 3MF。PrusaSlicer / Bambu Studio / OrcaSlicer 都可以把模型 + printer profile + 工艺参数保存为 .3mf 项目文件。G-code 是机器指令文件,是切片输出的最后一步,它针对具体一台机器、一种工艺——不同打印机、不同材料的 G-code 不可互换。

这里关键的一点是:G-code 是不可再编辑的快照,3MF 项目是仍可回到 slicer 里再调的活工程文档。这两者的差别,和 source code vs binary 的差别非常像。

二、源文件那条岔路口:Blender 自由网格与参数化 CAD

源文件层有两种范式,做出来的体感完全不同。Blender 是自由网格建模,每个对象是 evaluated mesh,导出 STL 时 Modifier 栈被求值后丢失——也就是说,Blender 内部的 Subdivision Surface、Mirror、Boolean 等设计意图在 STL 文件里没有任何痕迹。这是 Blender STL 导出官方文档明示的:导出使用「evaluated mesh」,所有 Modifier 应用后的网格。

更糟的是 STL 本身没有单位字段——Blender 端默认 1 BU = 1 m,导出时只能靠 Scene Unit 复算。Blender 官方 STL 导入/导出文档的导出面板里只有 Scale(纯数值)、Scene Unit(布尔)、Format(ASCII/Binary)等字段,没有单位标记。

图注:Blender 内部 1 BU = 1 m 是默认事实,但 STL 文件没有单位字段。导出时由 Scene Unit 开关决定是否应用 Blender 端定义的单位;读入端则靠这个开关把 Blender 场景单位应用到顶点。单位语义不在 STL 里,靠消费方自行假定。BlenderSTL

另一边是参数化 CAD。FreeCAD 的 PartDesign Workbench 是典型的累积体范式:每一步(Pad 加、Pocket 减、Hole、Fillet、PolarPattern 等)依次作用在前一步的累积结果上,Body 通过「tip」指向当前可见状态。改一处尺寸时,只要在上游 sketch 的尺寸参数处改一次,下游所有操作自动重算。

下面是 FreeCAD Wiki 给出的 Part vs PartDesign 树视图对照:

图注:Part Workbench 走 CSG 路线,Cut / Fusion / Array 这些 boolean 节点显式列在树视图里,每个节点独立——改一处尺寸要回到那个 primitive 上手工改。

图注:PartDesign Workbench 走累积体路线,Body 之下是连续 feature 列表(Origin → Revolution → Pocket → Pad → Hole → PolarPattern),改一处尺寸全链跟随——这就是「参数化」在工程上可观测到的真正意义。FreeCAD

CadQuery 是另一条参数化路:Python 库,基于 OCP(OCCT 的 Python 绑定),能直接导出 STEP、3MF、STL、AMF 等 12 种格式。这意味着 LLM 输出的 Python 脚本就是源文件,能被 CadQuery 像运行普通 Python 一样生成、修改、再导出——这是后面讲 LLM 辅助建模时天然落点的根据。

这一步讲完应该留下一个 mental model:拿到 .blend / .py / .FCStd 这样的源文件时,改尺寸的体验完全不同;拿到 .stl 时基本只能从头改。下一步是看模型怎么变成机器能动的指令。

三、切片软件在中间做了什么?

切片软件(slicer)不是「一键转 G-code」。它的工作是:读入模型 + printer profile + 工艺参数 → 做层切分、墙数、infill、支撑、seam 放置 → 输出切片项目(3MF)+ 机器指令(G-code)。

FDM 单条挤出物的截面形状是「矩形 + 半圆」,面积公式 Area = h(width−h) + π(h/2)²。这是 Prusa Knowledge Base 的官方表述: FDM FDM

图注:PrusaSlicer 假设单条挤出物截面为矩形 + 半圆端。图中标注 ønozzle、h(高度)、width(宽度)三个参数,说明 layer height(Z 方向分辨率)与 extrusion width(XY 平面线宽)是两个独立函数——不能混。PrusaKB

为什么这件事重要?因为它直接推出「壁厚 ≠ perimeter 数 × extrusion width」——相邻 perimeter 是有意 overlap 的,detect thin walls 在某些组合下会被自动禁用。

2026 年的 FDM slicer 市场有四大代表,Bambu Studio / OrcaSlicer / PrusaSlicer / Ultimaker Cura。它们的关系并不平行:

四个 slicer 在生态位上分得很开:

维度Bambu StudioOrcaSlicerPrusaSlicerUltimaker Cura
厂商/维护方Bambu LabSoftFever 社区Prusa ResearchUltimaker
多色/AMS行业最深支持 AMS-liteMulti-Material Interlocking通过插件
校准工具完善best-in-class + Klipper 原生完善完善
树状/有机支撑一般最强一般一般
云依赖是(Filament Manager)无无有限
适用场景纯 Bambu 硬件用户Klipper / 混品牌机群产线 / 稳定保守新手 / 特殊插件

更关键的是:3MF 已经是 2026 年跨 slicer 互通的事实桥梁。同一个项目文件可以从 OrcaSlicer 起手交给 PrusaSlicer 用户继续切片,几何、缩放、排版数据不丢;打印参数互通仍依赖具体 slicer 的实现。SlicerCompare

四、用 GPT/LLM 辅助建模时,它停在接力跑道的哪一层?

PrimitiveCAD 是 2026 年 10 月 arXiv 上的一篇代表性工作(arXiv:2610.08698,cs.GR),它做的事情很直接:把点云 token 化、训练一个 LLM 输出 CadQuery Python 脚本,让 Python 脚本最终构造一个 B-Rep。

图注:PrimitiveCAD 三阶段管线。左:点云 tokenization(PTv3 backbone + sketch / extrude / cylinder / box 四类原语实例分割)。中:SFT 阶段把 token 喂进 Qwen2 LLM,让它输出 CadQuery Python 序列,辅以 operation alignment loss 对齐算子频率。右:RL 阶段用 GRPO 加 feature-line alignment reward 优化细粒度特征保留。PrimitiveCAD

下面这张图展示了 tokenization 实际长什么样:

图注:CAD 类点云按 sketch / extrude / cylinder / box 四类原语着色的视觉示例。每类最多 K=8 instances。这是一个带语义的点云,不是 ready-for-print 的 mesh——它还停在「几何有效 B-Rep」那一层。

这一点是引入「四层验收」的关键:

  1. 看起来对(LLM 生成了一段语法上合法的 Python 代码)
  2. 几何有效(脚本能跑通,B-Rep 是 watertight、无自相交的)
  3. 能切片(slicer 接受、layer cut 不报错)
  4. 能打印(machine 真的能按 G-code 物理动作)
  5. 满足使用(实物尺寸、强度、公差都达预期)

PrimitiveCAD 这类工作做到第 2 层就停下了。它把 token-only SFT 算子 count drift、volume-only RL 漏局部特征、通用点云 backbone 无 CAD-specific 先验三类常见失败都明确点出来。但「能切片」和「能打印」这两关,它没碰——这是下一节要展开的。

把这件事推到顶:当你向 GPT 要一个能 3D 打印的模型时,你到底在向它要哪一层产物?是源文件(Python / .blend / .FCStd)、是 STL/STEP/3MF、是切片项目(带 slicer 设置的 3MF)、还是直接能打的 G-code?四类产物的可验证性完全不同——源文件能 diff、能 re-run;STL 只能目视;G-code 只能切片模拟;只有最后一步实物打印能闭环。

五、验收那几道门:mesh 几何检查 + FDM 工程现实

mesh 导出来 ≠ 能切片,能切片 ≠ 能打出来。两道门分别归 Blender 3D Print Toolbox 和 FDM 工程现实管。

Blender 3D Print Toolbox 自带的 Checks 面板把 3D 打印对网格的最低要求拆成 8 项:Solid / Intersections / Degenerate / Distorted / Thickness / Edge Sharp / Overhang / Check All。Solid 检查要求每条边恰好被 2 个三角形共享——这是 manifold edge 的官方定义;如果只被 1 个面共享说明网格有洞。

图注:同一形状的两种常见 manifold 错误对照——一侧高亮非流形边(网格有洞),另一侧高亮法向不一致(Bad Contiguous edges)。watertight 不只是「无洞」,还要求拓扑一致。PrintToolbox

Intersections(自相交)是另一个常见问题:

图注:两个立方体相邻面几何嵌入——这是 Blender 自由建模中 Boolean 残留的典型副产物。Blender Manual 提示某些 slicer 能容忍自相交,但尽量提供干净 mesh 仍是官方建议。

但 3D Print Toolbox 只覆盖「几何有效」这一层,工艺相关项(壁厚量级、悬角、teardrop 孔、SLA 排液孔)不在它的检查范围内。

FDM 工程现实这一关,由 Prusa Knowledge Base 与社区 DfAM 共识给出: DfAM

  • Layer height 与 extrusion width 是不同函数:前者是 Z 方向分辨率,后者是 XY 平面线宽。
  • 0.4 mm nozzle 是桌面 FDM 事实标准;换更小的 0.25 mm nozzle 能保住小字浮雕等 XY 细节。
  • FDM tolerance 经验值约 ±0.1 mm,圆形因 nozzle 拖拽总是偏小;seam 在圆周上更糟,会把 ±0.1 mm 退化到 ±0.4 mm。
  • Perimeters 数比 infill % 更影响强度——弯曲应力在截面外侧最大,加 perimeter 比加 infill 更有效。
  • Clearance fit 安全阈值 ≥ 0.2 mm(约 2× printer tolerance),print-in-place 推荐 ≥ 0.3 mm。
  • Detect thin walls 开启后把薄壁塌缩为单条 perimeter,但比单条 extrusion width 还薄的壁仍会被忽略——这是把 mesh 修干净之后 slicer 内部还要面对的工程现实。

六、工艺换了,文件策略也得换:FDM/SLA/SLS 横向 + GPT 产物收束

把 FDM 当成「3D 打印」的全部,是另一个常见误解。三种工艺在最小壁厚、悬角、是否需要支撑、封闭内腔处理上的硬差异如下:

维度FDM(挤出)SLA(光固化)SLS(粉末烧结)
最小壁厚(supported wall)0.8 mm 量级(单 perimeter ≈ 0.4 mm)0.2 mm(像素级精度)0.3 mm(无支撑悬空仍可)
悬角规则45° 自支撑,超过需支撑30°(刚性树脂)任意角度(粉末自支撑)
封闭内腔处理不适用(已沉积就不存在被封)必须开 drain hole(避免吸盘力扯飞件)必须开 escape hole ≥ 5 mm(粉末流出)
表面光洁度可见层纹光滑颗粒感
press fit interference0.05 mm,但可重现性差0.05 mm(推荐工艺)0.05 mm
sliding fit 间隙0.3 mm0.15 mm0.2 mm

下面是 Formlabs 商业博客上的两个实物对照——同一外壳设计在三工艺下打出来外观差异明显:

图注:同一外壳设计在 FDM/SLA/SLS 三种工艺下打出的实物外观对照:左件明显层纹与残料崩缺;中件光滑有光泽;右件磨砂颗粒感。但图中没有工艺身份标注,仅作工艺差异的实物外观辅助。DFAMGuide

图注:FDM 与 SLA 表面细节对比。FDM 件呈现水平层纹、丝状残留、深色镂空孔边缘未融化细丝;SLA 件表面光滑均匀,中央圆角矩形凹槽里嵌数字「2」浮雕。这是 DfAM 复习里最常被引用的「FDM vs SLA 表面精度对比」配图。

把所有内容收束到 GPT 辅助建模这件事上——四层文件分层映射到三类产物清单:

产物类型文件层用 GPT 怎么要验收方式
源文件可编辑源文件要 CadQuery Python / FreeCAD .FCStd / Blender .blend能 diff、能 re-run;改一处尺寸看下游是否自动跟随
可打印模型文件模型交换文件要 3MF / STEP(不只 STL)跑 Blender 3D Print Toolbox 8 项检查;至少 Solid + Intersections + Degenerate 通过
验证记录切片项目 + 机器指令要 slicer 项目(3MF)+ 模拟打印截图 + 实测公差切完后看层预览;实物打印后量关键尺寸

这一步把全篇的张力「模型看起来出来了 ≠ 能打印」闭合:向 GPT 要模型时,至少同时要这三类产物才算完整——单给一个 STL 是不够的,因为 STL 既没单位、也没法继续编辑、也没法切片回看。

如果一定要把这一篇浓缩成一件事,那就是:3D 打印是一条接力跑道,每一层有自己的文件形态和验收门;LLM 给的模型只停在其中一两层,剩下的门要你自己走。

参考文献

  1. PrimitiveCAD: An LLM-Based Point-to-CAD Reconstruction with Primitive-Aware Tokenization and Operation Alignment — arXiv:2610.08698
  2. 3MF Core Specification v1.3.0 / v1.4.0 + 3MF Consortium — 3mf.io/spec/core-v1-3-0
  3. 3MF file format and why it's great (Prusa Blog, 2019-11) — blog.prusa3d.com/3mf-file-format-and-why-its-great_30986
  4. ISO 10303-242:2025 (AP242 Ed4) Managed model-based 3D engineering — iso.org/standard/84300
  5. Blender Manual 4.0 — 3D Print Toolbox Add-on — docs.blender.org/manual/en/4.0/addons/mesh/3d_print_toolbox.html
  6. Blender 5.2 LTS Manual — STL import/export + Scene Properties Units — docs.blender.org/manual/en/latest/files/import_export/stl.html
  7. CadQuery Official Documentation + FreeCAD Wiki Part_and_PartDesign + PLOS ONE 2019 OpenSCAD/FreeCAD/CadQuery comparison — cadquery.readthedocs.io · wiki.freecad.org/Part_and_PartDesign · journals.plos.org/plosone/article?id=10.1371/journal.pone.0225795
  8. 2026 主流切片软件对比综合 review (FilamentFeed, 2026-06-25) — filamentfeed.com/article/orcaslicer-vs-bambu-studio-2026-june-2026
  9. Design for 3D-Printing (Rahix, 2025-05-04) + Prusa Knowledge Base Layers and Perimeters / Infill / Seam + Prusa Blog Nozzle Diameter — blog.rahix.de/design-for-3d-printing · help.prusa3d.com/article/layers-and-perimeters_1748
  10. DfAM 设计准则综合 review (Slicience / Formlabs / Wyntek / 3DPrintMap / Wevolver / Protolabs) — slicience.com/en/docs/reference/design-rules · formlabs.com/blog/fdm-vs-sla-vs-sls-how-to-choose-the-right-3d-printing-technology
为什么 LLM 给的 STL 还打不出来?3D 打印文件格式与切片入门