UltKit

STL、OBJ与3MF对比:3D文件格式该选哪个?

只需切片的单色打印用STL,模型带有用于渲染或游戏引擎的纹理时用OBJ,切片软件支持且希望单位、颜色和多个部件完整保留时用3MF。格式决定哪些元数据随网格一起传递,但永远决定不了网格本身是否完好。

Jonas WeberJonas Weber网站性能编辑
更新于 12 分钟阅读
白色桌面上一台带透明外罩的桌面3D打印机,旁边的笔记本电脑显示着3D模型,还有地形图、红色齿轮等彩色打印件

STL:一串三角面,别无其他

STL 诞生于 1987 年,是为 3D Systems 的首批立体光固化设备设计的,从它的结构上就能看出这一点。文件就是一份平铺的三角形列表,每个三角形由一个面法线和三个顶点描述。它没有共享的顶点表,所以被六个三角形共用的顶点会被写六次。它也没有单位字段:坐标 25 可能是毫米、英寸或米,几乎所有切片软件都按毫米来猜。颜色、贴图和零件名称在核心格式中都没有位置,但正因如此,所有切片软件、CAD 软件和打印服务至今仍能读取它。

STL 有两种编码。ASCII STL 全部以文本写出,包含 facet normal、outer loop、vertex 12.5 0 3.2 这样的行,可以用文本编辑器打开直接看数字。二进制 STL 以 80 字节的头部和 4 字节的三角形数量开头,然后把每个三角形存为十二个 4 字节浮点数加一个 2 字节的属性字段,正好 50 字节。这条规则让大小很容易预估:一百万个三角形的模型,二进制约 50 MB,而同一网格的 ASCII 版本通常大四到六倍,因为每个数字都变成了字符。

简单既是优点,也是陷阱。STL 无法告诉你它本来是一个零件还是三个,是否以英寸导出,或者三角形是否真正围成了实体。这些都要由切片软件根据原始坐标推断,猜错时就会得到缩小 25.4 倍的零件或缺失的墙面。如果是你自己设计、以毫米导出的单色零件,这些都不成问题,STL 依然是最不容易被拒收的格式。

OBJ:多边形、UV和附带的材质文件

OBJ 来自 Wavefront Technologies,该公司的 Advanced Visualizer 软件在 20 世纪 80 年代末使用了它,90 年代它作为几乎所有 3D 程序都能交换的纯文本格式流行开来。与 STL 不同,它保存顶点列表并用索引构建面,共享顶点只存一次,面可以是三角形、四边形或更大的多边形。以 v 开头的行是位置,vt 是贴图坐标(UV),vn 是法线,f 是面。组(g)和对象(o)为各部分命名,所以 OBJ 在 Blender、Maya 或 ZBrush 之间来回导入导出时结构都能保持完整。

外观信息不在 .obj 文件里。mtllib 行指定配套的 .mtl 文件,usemtl 行把材质分配给面。.mtl 文件保存 Kd(漫反射)等颜色,并通过 map_Kd wood.png 这样的条目指向贴图图片。因此带贴图的 OBJ 至少由三类文件组成:几何体、材质库和一张或多张图片,全部通过相对路径引用。只发送 .obj,对方看到的就是灰色模型。这种分离在游戏和影视特效流程中很有用,美术可以在不改动几何体的情况下替换贴图,但它也是下载的模型看起来不对的最常见原因。

OBJ 和 STL 一样在比例上存在盲区:只存裸数字,没有单位。多数建模工具写出的是米或厘米,而切片软件按毫米读取,所以来自游戏素材商店的 OBJ 可能会差 10 倍或 1,000 倍。对于打印,OBJ 除了少数工具支持的顶点颜色外,没有切片软件用得上的内容,所以要打印美术素材时,通常最简单的做法是保留贴图用于渲染,只给切片软件一个干净的网格。反过来,把 STL 转成 OBJ 是把打印模型带入渲染或游戏流程的最短路径。

3MF:专为打印设计的ZIP包

3MF 由 3MF Consortium 于 2015 年发布,该联盟由微软发起,成员包括打印和 CAD 行业的公司。.3mf 文件是一个 ZIP 压缩包,与 ZIP、RAR、7z 对比中讨论的容器格式相同。把它改名为 .zip,就能看到包含网格的 3D/3dmodel.model XML 文件、内容类型文件、关系文件,通常还有缩略图和切片配置。每个模型都声明自己的单位(微米、毫米、厘米、英寸、英尺或米),所以困扰 STL 和 OBJ 的比例问题根本不会出现。颜色、基础材质、多个对象及其在打印板上的摆放位置都是规范的一部分。

规范还要求网格是流形且方向一致的:每条边恰好被两个三角形共享,所有面都朝外。遵循规则的导出器无法写出 STL 能轻易容纳的开放、自相交几何体。目前主流工具的支持很广泛。PrusaSlicer、Bambu Studio、OrcaSlicer 和 UltiMaker Cura 都能读取 3MF,PrusaSlicer 和 Bambu Studio 会把整个项目连同打印设置和绘制的颜色保存为 .3mf,Windows 上微软的 3D Builder 应用也能直接打开。薄弱环节是仍然只认 STL 的旧固件、打印农场门户和 CAD 导入器;遇到这些情况,请把 3MF 转成 STL,并接受额外信息会被舍弃。

from ↓ · to →UnitsColorTextures多个零件打印设置流形规则
STL– STL to Units: no– STL to Color: no– STL to Textures: no– STL to 多个零件: no– STL to 打印设置: no– STL to 流形规则: no
OBJ– OBJ to Units: noOBJ to Color: yesOBJ to Textures: yesOBJ to 多个零件: yes– OBJ to 打印设置: no– OBJ to 流形规则: no
3MF3MF to Units: yes3MF to Color: yes3MF to Textures: yes3MF to 多个零件: yes3MF to 打印设置: yes3MF to 流形规则: yes
supported not offered行是格式,列是文件本身能携带的内容。OBJ 的颜色和贴图需要单独的 .mtl 文件和图片;3MF 的贴图来自其材质扩展。少数工具会把颜色写进二进制 STL 未使用的字节,但没有标准对此作出规定。
木质工作台上一排开放式框架的 3D 打印机,最近的一台打印板上有几个蓝色圆柱形零件
照片:Unsplash

按用途选择格式

选哪种格式取决于文件接下来要去哪里,而不是哪种更新。如果下一站是切片软件,且零件是单色的,STL 就够用,而且它仍是所有论坛、模型库和打印服务都能识别的格式。如果下一站是渲染器、游戏引擎或其他美术人员的建模工具,OBJ 会保留 STL 丢掉的 UV、法线和命名组,而且它的文本形式便于检查问题。

当文件携带的不只是几何体时,3MF 就有了用武之地。在 Bambu Studio 中绘制的多色打印、为一次任务排好的十二个零件的打印板、以英寸设计的零件,或者想以相同层高和填充重新打开的项目,都需要 3MF,因为这里的其他格式都无法保存这些信息。如果要面向多个目的地,请把信息最丰富的版本作为主文件,再用 3D 模型转换器从它导出较简单的版本,而不是连续转换。

普通打印用 STL

一个零件,一种颜色,以毫米导出。所有切片软件、CAD 导入对话框和打印服务上传表单都能打开。

带贴图的模型用 OBJ

为 Blender、Maya、Unity 或 Unreal 提供 UV、法线和命名组。请把 .mtl 文件和贴图图片一起发送。

新版切片软件用 3MF

真实单位、颜色、多个对象和打印设置都在一个 ZIP 中。是 PrusaSlicer 和 Bambu Studio 的原生项目格式。

3D文件出问题的五种情况

多数被归咎于格式的打印失败和导入出错,其实是网格本身的问题,或是接收程序对网格做了错误假设。STL 最容易出问题,因为它没有元数据来发现错误;OBJ 同样有比例和文件缺失的问题;3MF 在设计上避免了其中大部分,不过粗心的导出器仍可能写出有问题的网格。展开下面各项,了解每种问题的表现和常见来源。

非流形网格

边只被一个三角形共享,或被三个及以上三角形共享,表面之间有缝隙,或墙面厚度为零。切片软件会显示缺层、随机孔洞或开放边警告。原因出在建模或导出环节,常常是合并了仅仅相接的零件。

法线反向

部分三角形朝向内侧。渲染器会显示黑色或透明的区域,切片软件可能把该区域当作空白。在 Blender、Meshmixer 或切片软件的修复工具中使用重新计算法线命令即可解决。

毫米与英寸混淆

以英寸绘制的零件在按毫米处理的切片软件中会缩小 25.4 倍;把厘米当作毫米读取则会有 10 倍的误差。STL 和 OBJ 无法记录单位,所以需要在导出或转换时自行设置。

缺少 .mtl 文件或贴图

加载后呈灰色或洋红色的 OBJ,说明丢失了材质库或图片,或者 .mtl 内的路径指向原作者电脑上的某个文件夹。请把所有文件放在同一个文件夹里,并一起打包成 ZIP。

体积巨大的 ASCII STL 文件

精细的扫描模型保存为 ASCII STL 后可能超过几百 MB,使切片软件变慢,也会触及上传限制。把同一个网格重新导出为二进制 STL,大小可缩小到约五分之一,而且一个三角形都不会改变。

各格式的文件通常有多大

大小由结构决定。二进制 STL 固定为每个三角形 50 字节,所以导出前就能算出来。ASCII STL 会把每个顶点重复写成文本,通常比二进制大四到六倍。OBJ 把每个共享顶点只存一次并通过索引引用,所以典型的封闭网格比 ASCII STL 小,大致与二进制 STL 相当,如果还带有 UV 和法线则会更大。3MF 存储带索引的 XML,再在 ZIP 内压缩,因此对于相同的几何体,通常是三者中最小的。

下面的数字针对约 500,000 个三角形的封闭网格,例如一个精细的手办模型。实际文件会因坐标精度和导出器而异,因此请只当作数量级参考,在打印服务限制上传大小,或从 3MF 导出的 STL 大了好几倍时会有帮助。

二进制 STL(500,000 个三角形 × 50 字节)
≈ 25 MB
ASCII STL,同一网格,典型值
≈ 100–150 MB
不含 UV 的 OBJ,典型值
≈ 15–30 MB
ZIP 压缩后的 3MF,典型值
≈ 5–12 MB

转换能解决什么、永远解决不了什么

转换就是从一个容器中读取三角形,再写入另一个容器。目标格式能表达的内容会被带过去,不能表达的则被丢弃。所以 STL 转 OBJ 在几何体上是无损的,3MF 转 STL 会丢失颜色、单位和打印板布局,OBJ 转 STL 会丢失贴图和零件名称。在 UltKit 的 3D 工具中,这些额外的决定都是明确的:模型单位告诉转换器源文件使用的比例,向上轴处理游戏引擎与切片软件之间 Y 轴向上和 Z 轴向上的差异,合并为单个网格决定各个零件是否保持独立。

任何转换都不会修复网格。如果 STL 有个破洞,由它生成的 OBJ 也有同样的破洞,3MF 导出器要么拒绝它,要么照样写出来。修复是单独的一步,在网格工具或切片软件内置的修复功能中完成,最好在导出其他任何格式之前,在主文件里一次性做好。比例也是如此:除非你告诉它,转换无法知道零件本来是以英寸为单位的。细节同理:低多边形的 STL 只会变成低多边形的 OBJ 或 3MF,所以对质量有要求时,请从源模型重新导出。

更换格式能做什么

  • 把同样的三角形放进另一个程序能接受的容器
  • 应用你在模型单位中选择的单位,修正 25.4 倍或 10 倍的比例错误
  • 通过向上轴在 Y 轴向上和 Z 轴向上之间旋转模型
  • 改写成二进制,缩小 ASCII STL
  • 根据合并为单个网格,保留或合并各个独立零件

哪些内容保持原样

  • 孔洞、开放边和非流形几何体
  • 反向或不一致的法线
  • 自相交的零件和厚度为零的墙面
  • 网格首次导出时已丢失的细节
  • 目标格式没有位置存放的颜色和贴图

选择对照表:STL、OBJ还是3MF

讨论这个问题时,常常还会提到另外两种格式。STEP(ISO 10303)保存的是精确的实体和曲面,而不是三角形,所以零件需要回到 Fusion 360、SolidWorks 或 FreeCAD 中继续编辑时,应该用它。GLB 是 Khronos Group 的 glTF 2.0 的二进制形式,把网格及其材质和贴图打包进一个以米为单位的文件,适合在网页或 Android AR 中展示模型。

对于本文介绍的三种格式,下表按用途列出了选择建议。如果有两行都符合,就选携带信息更多的格式,之后再导出更简单的格式;从 3MF 转成 STL 很容易,而丢失的颜色或单位只能手动重建。

根据文件接下来的去向选择
使用场景推荐格式原因
单色零件,要导入任意切片软件STL(二进制)兼容性最广,切片软件不需要其他内容
上传到模型库或打印服务STL;如果支持,再加上 3MFSTL 一定会被接受;3MF 能保留单位和颜色
多色或多材料打印3MF这里唯一能为切片软件保存颜色和各部件材料的格式
带打印设置的多零件打印板3MF在一个文件中保存对象摆放位置和切片设置
以英寸为单位设计的零件3MF声明了单位,不会被错误地缩放 25.4 倍
用于 Blender、Unity 或 Unreal 的带贴图模型OBJ(+ .mtl 和图片)保留 UV、法线和材质分配
用文本编辑器快速查看OBJ 或 ASCII STL纯文本,可以逐行阅读
只支持 STL 的旧固件或旧软件STL去掉多余信息,只发送网格

要点总结

  • STL 只存储三角形:没有单位,没有颜色,二进制形式下每个三角形占 50 字节。
  • OBJ 增加了 UV、法线和命名组,但颜色和贴图依赖单独的 .mtl 文件和图片文件。
  • 3MF 是由 XML 组成的 ZIP 包,记录单位、颜色、多个对象和打印设置,并且要求网格是封闭的。
  • 普通单色打印用 STL,美术和游戏流程中的带贴图模型用 OBJ,只要切片软件支持就用 3MF。
  • 转换改变的是文件容器,而不是网格本身:孔洞和法线请在网格工具中修复,单位也要自己设置。
分享XFacebookWhatsAppTelegram

常见问题

STL会被3MF取代吗?

在打印流程中会慢慢取代。PrusaSlicer 和 Bambu Studio 已经把项目保存为 3MF,但 STL 仍是所有工具和模型库都接受的格式,所以两者还会共存多年。

二进制STL能存储颜色吗?

没有任何标准方式。少数程序会把颜色写入每个三角形的 2 字节属性字段,但多数切片软件会忽略它,所以需要颜色时请用 3MF 或 OBJ。

为什么下载后的OBJ显示为灰色?

可能是 .mtl 文件或贴图图片没有一起保存,或者 .mtl 中的路径指向了你电脑上不存在的文件夹。把 .obj、.mtl 和图片放在同一个文件夹,再重新加载模型。

ASCII和二进制STL哪个打印更精确?

实际打印中两者都不会更精确。它们描述的是同样的三角形;二进制把坐标存为 32 位浮点数,ASCII 存为文本,二进制文件通常小好几倍。

能把OBJ转回STL用于打印吗?

可以。三角形会原样保留,而 UV、材质和贴图会被丢弃,因为 STL 没有存放它们的位置。转换后请检查比例,因为建模工具导出的 OBJ 文件常以米或厘米为单位。

分享模型给别人打印应该用哪种格式?

提供 STL 以获得最广的兼容性;如果模型有多个部件、带颜色,或是以英寸设计的,再在旁边附上 3MF,让使用新版切片软件的人获得完整设置。

继续阅读