STL 是 3D 打印领域最常用的格式,但当你想把这个模型导入 Blender、Maya 或者其他 3D 建模软件编辑的时候,会发现 OBJ 格式更受欢迎。这篇讲一下这两种格式的区别、为什么要转换,以及转换过程中需要注意的事情。

STL 格式有什么特点

STL 全称 Stereolithography,是 3D Systems 公司在 80 年代末为光固化 3D 打印技术设计的文件格式。它的结构非常简单,整个模型就是一堆三角形面片拼起来的。

具体来说,一个 STL 文件只记录了这些东西:

  • 每个三角形的三个顶点的 XYZ 坐标
  • 每个三角形的法线方向(用来判断哪一面是朝外的)

没了。没有颜色,没有材质,没有纹理坐标,没有曲线信息,没有层级结构。就是一个纯粹的几何壳体。

STL 有两种存储方式:ASCII 文本格式和二进制格式。文本格式人能看懂但文件很大,二进制格式体积小但打开就是乱码。一般二进制用得多一些。

这种极简设计的好处是兼容性极高——几乎所有跟 3D 沾边的软件都能读写 STL。缺点也很明显,丢失的信息太多。两个外观一样的模型,一个是彩色的带材质的,一个是白模,导出成 STL 后看起来没区别。

OBJ 格式有什么特点

OBJ 是 Wavefront Technologies 在 90 年代开发的格式,后来成了事实上的通用 3D 交换格式之一。和 STL 相比,OBJ 能记录的信息要多不少:

  • 顶点数据:位置坐标、法线、UV 纹理坐标都有
  • 面片定义:不只是三角形,还支持四边形和多边形面片
  • 顶点颜色:可以在每个顶点上指定 RGB 颜色值
  • 材质引用:通过外部的 MTL 材质文件定义表面属性(颜色、光泽度、贴图等)
  • 自由曲线和曲面:支持曲线和曲面的参数化定义

OBJ 本身是纯文本格式,一行行写着顶点坐标和面的定义,用文本编辑器就能打开看。配合 MTL 材质文件一起使用才能完整还原模型的视觉效果。

主流 3D 软件对 OBJ 的支持都很完善,Blender、Maya、Cinema 4D、ZBrush 这些都能正常导入导出。这也是为什么它在建模师之间流通得比较好。

为什么要从 STL 转 OBJ

实际工作中需要做这个转换的场景挺多的:

  1. 导入建模软件编辑:从 Thingiverse 或其他模型网站下载了一个 STL 文件,想在 Blender 里改一下某个部件的大小或者加个新零件。Blender 能导入 STL,但导入后的模型往往缺少法线和正确的面片组织,编辑起来不太方便。转成 OBJ 再导入的话情况会好一些。
  2. 添加颜色和材质:STL 本身不支持颜色信息,即使原模型是彩色的,导出成 STL 后颜色就丢了。如果后续需要在其他软件里重新上色或贴材质,用 OBJ 格式会更合适,因为 OBJ 至少能通过 MTL 文件携带材质定义。
  3. 给游戏引擎用:Unity 和 Unreal Engine 虽然也能吃 STL,但工作流程上更倾向于 OBJ 或 FBX 这类带材质信息的格式。转成 OBJ 后再导入引擎,后续操作会更顺畅。
  4. 提交给美工团队:如果你这边只有工程用的 STL 白模,要交给设计师去做渲染或者做产品展示图,对方通常希望拿到 OBJ 格式,方便他们在熟悉的软件里处理。

STL 转 OBJ 会丢失信息吗

从 STL 转 OBJ 这个过程本身不复杂,本质上就是把三角形的顶点和面片数据翻译成 OBJ 的语法格式。但有几点需要注意:

关于信息丢失:这里有个容易误解的地方——STL 里本来就没有的颜色、材质、纹理这些信息,并不会因为转换而"丢失",因为它一开始就不存在。转换只是换了种方式表达同一个几何体,不会凭空产生原来没有的数据。所以别指望转完 OBJ 之后模型突然就有颜色了。

法线重新计算:STL 文件里的法线方向有时是不一致的(尤其是不同软件导出的 STL 规范程度不一样)。转换工具通常会根据面片的环绕顺序重新计算法线方向,确保所有面片的朝向统一。大多数情况下这样处理没问题,但如果原始模型本身就有些面片方向搞反了,转出来可能还是反的,需要在建模软件里手动翻转。

面片数量不变:STL 到 OBJ 的转换不会增加也不会减少三角形的数量。原本多少个面片,转出来还是多少个。如果你想要更精简的模型(减少面片数),需要在转换之后用减面工具单独处理。

MTL 材质文件:标准的 STL 转 OBJ 流程生成的 OBJ 通常不带 MTL 材质文件,或者说生成的是一个空的 MTL。这是因为源文件就没有材质信息可写进去。如果后续需要材质,就得自己在建模软件里新建材质并指定。

怎么进行转换

转换的方法有好几种:

Blender:免费开源,导入 STL 然后导出为 OBJ 就行。还能顺便做法线修正、减面等额外操作。适合已经装了 Blender 或者愿意装一个的用户。

MesHLab:也是免费的开源工具,专门处理网格模型。支持批量转换,功能比 Blender 的导入导出更专注于网格处理这块。

命令行工具:Assimp 库提供了命令行转换工具,适合程序员或者需要自动化批处理的场景。写个脚本就能一次转几百个文件。

在线转换:不用装任何软件,上传 STL 文件,等几秒钟就能下载 OBJ 结果。对偶尔转一两个文件的人来说最省事。

转换后的检查建议

不管用什么方式转换完成之后,最好花一分钟检查一下结果:

  • 用查看器打开 OBJ 看看模型外形有没有变形
  • 确认没有出现破洞或者缺失的面片
  • 如果模型有明确的正反面,检查一下法线方向是否正确(背面不应该朝外)
  • 对比一下文件大小,异常偏小可能说明有问题

大多数情况下 STL 转 OBJ 都很顺利,不会有什么意外。但养成检查的习惯能避免后面流程里出了问题回头排查半天。

常见问题

STL 转 OBJ 后文件变大了正常吗?

正常。OBJ 是文本格式,STL 可以是二进制格式。同一个模型,OBJ 文件通常比二进制 STL 大 2-5 倍。如果体积差异过大,检查是否重复写入了法线或纹理坐标数据。

转换后模型颜色没了?

STL 格式本身不支持颜色信息。如果你看到带颜色的 STL,那可能是扩展格式。转成 OBJ 后颜色不会自动出现,需要手动在 OBJ 文件中关联材质文件(.mtl)来添加颜色。

能批量转换吗?

在线工具支持单文件转换。批量转换建议用 Blender 的命令行模式,或者安装 FreeCAD 用 Python 脚本批处理。命令行工具 meshconv 也支持批量格式转换。