作者:Huy Nguyen · ·
网上下载的 3D 模型大多是 OBJ,Blender、ZBrush 以及各种模型素材站给你的也是 OBJ。而切片软件和打印服务要的是 STL。这一页存在的理由就是这个落差,来到这里的人基本都是准备拿去打印的。
这个转换是一次收窄。OBJ 是纯文本,可以带四边面和多边面、UV 坐标、顶点法线、多个命名对象,还会用一行引用外部材质文件。STL 则只是一串三角面,别的什么都没有:没有颜色、没有材质、没有对象名、没有单位。与其听人说转换有多快,不如先弄清你究竟会丢掉哪些东西。
所以我们今天专门做了一个把上面这些全带齐的 OBJ,用这个页面背后同一个转换器跑了一遍,再把结果放回 Blender 5.1 里数了一遍。下面每一个数字都来自这次实测。
这次实测保住了什么,丢了什么
输入是一个 8,685 字节的 OBJ,里面有两个命名对象:一块由 6 个四边面组成的底板,和一根 32 边的柱销,柱销两端各是一个完整的 32 边形面。合起来 72 个顶点、40 个面,外部 MTL 里有两种颜色材质,每个对象一套 UV,40 条顶点法线,并且以米为单位建模,所以尺寸是 0.12 x 0.08 x 0.06。
| 输入 | 输出 | 结论 |
|---|---|---|
| 40 个面:38 个四边面加 2 个 32 边形端面 | 136 个三角面 | 是转换,不是丢失。38 个四边面变成 76 个三角面,两个端面变成 60 个 |
| 72 个顶点,坐标精确 | 同样 72 个顶点,坐标分毫不差 | 保住了。文件里写了 408 条顶点记录,但它们会合并回 72 个 |
| 两个命名对象 BasePlate 和 RedPin | 合成一个网格 | 丢了。STL 根本没有对象或分组这个概念 |
| 外部 MTL 里的两种材质 | 什么都没有 | 丢了。STL 完全无法存颜色和材质 |
| 每个对象一套 UV,共 159 个纹理坐标 | 什么都没有 | 丢了。STL 里没有放 UV 的字段 |
| 40 条顶点法线 | 每个三角面一条平面法线 | 被替换。STL 只按面存法线,不按顶点存 |
| 0.06 的高度在 Y 轴上 | 同样 0.06 的高度,转到了 Z 轴 | 保住并且旋转正确,见下文 |
| 8,685 字节文本 | 6,884 字节二进制 STL | 这次小了约 21%,原因见下文 |
四边面和多边面会被切成三角面,而且数量可以算出来
这是最常见的意外。很多人打开转好的 STL,看到面数暴涨,就以为转换器偷偷加了细分或者加了细节。其实没有。
STL 只能描述三角面。一个四边面必须切成两个,一个 n 边面切成 n 减 2 个。我们的文件有 38 个四边面和 2 个 32 边形端面,所以算式是 38 乘 2 再加上 2 乘 30,等于 136。转出来的 STL 正好是 136 个三角面,文件 6,884 字节,也就是 84 字节文件头加每个三角面 50 字节,和二进制 STL 的结构一个字节都不差。
除此之外什么都没变。先在 Blender 里把源文件三角化,就已经是 136 个三角面,转换之后还是 136 个,所以既没有新增细节,也没有被简化。想提前知道数量,数一下自己的四边面和多边面,按上面的算式算就行。
多个对象会合成一个
底板和柱销进去时是两个分开命名的对象,出来时变成了一个网格。这是格式本身决定的,不是转换器的取舍:一个 STL 文件就是一长串三角面,没有任何地方可以记录某一批面属于同一个部件。
实际用起来往往没问题,因为切片软件通常能在一个 STL 里认出彼此分离的实体并重新拆开。真正会出问题的情况是:各个零件需要不同的打印参数或不同的耗材,或者你想在热床上分别摆放它们。那就从建模软件里把每个对象各自导出一个 STL,或者改用 3MF,它是会保留独立对象的。
材质、UV,以及那个你上传不了的 MTL 文件
OBJ 自己并不装材质。它只是用一行字引用放在旁边的 MTL 文件,颜色和贴图名字都在那个文件里。我们这份 MTL 定义了一种灰色树脂和一种红漆。
我们只上传了 OBJ 本身,单文件上传也只能传这一个,转换照样成功。对于 STL 这个目标格式,这完全不吃亏,因为 STL 本来就没有放颜色和材质的字段。有没有 MTL,转出来的 STL 是一样的。
如果你要的就是外观,那 STL 从一开始就选错了。要给彩色打印机用,3MF 可以按对象存颜色,也是支持彩色的切片软件期待的格式。要保住贴图,就从 OBJ 转成 GLB 或 FBX,本站都支持,并且把 OBJ 留着当母版。
单位:以米建模的 OBJ 会变成一个小点
OBJ 和 STL 都不记录长度单位。文件里的数字是什么意思,完全由读它的程序决定,而切片软件一律按毫米理解。
我们的模型是以米建模的,Blender 导出的文件或者游戏素材通常就是这样,尺寸是 0.12 x 0.08 x 0.06。STL 里存的是一模一样的数字,所以切片软件看到的是一个 0.12 毫米宽的东西,比喷嘴口还细。
这不是转换的错,再转一次也永远修不好,因为两个文件里都没有单位可以纠正。在切片软件里把模型放大 1000 倍,或者在建模软件导出前先设好单位比例。反过来,如果零件大得荒唐,那说明源文件本来是毫米,而中间有东西已经乘过一遍了,那就缩小。
朝向:零件是站着出来的,不是躺着
按惯例 OBJ 以 Y 轴为上,而 STL 按 Z 轴为上来读,所以这个转换必须把模型转过来。我们没有靠看图判断,而是直接把两个文件里的原始坐标读出来对比。
源 OBJ 里那 0.06 的高度在 Y 轴上。转出的 STL 里同样这 0.06 在 Z 轴上。把结果导回 Blender,世界空间尺寸是 0.120 x 0.080 x 0.060,对象本身没有任何旋转,也就是说它和建模时一样是正立的。
所以如果你的零件真的侧躺着出来,先怀疑模型而不是转换:本来就躺着建的网格,转完还是躺着。在热床上转一下方向就行,任何切片软件都是一键的事。
文件体积可能变大也可能变小
我们 8,685 字节的 OBJ 变成了 6,884 字节的 STL,小了约 21%。这既让以为二进制一定比文本小的人意外,也让听说过 STL 会让文件膨胀的人意外。
两种说法都只对一半。二进制 STL 会为每个用到某个顶点的三角面都重复写一遍这个顶点,没有共享顶点表,所以面数一多确实会膨胀。但 OBJ 是文本,而我们这份文件的字节大半花在 159 行 UV 和 40 行法线上,这些 STL 根本不需要。把它们去掉,对比结果就反过来了。
实用的判断是:只有几何数据的 OBJ 转成 STL 通常会变大,而带 UV、法线很多的 OBJ 可能会变小。如果快到上传上限了,老实减面,不要靠猜格式开销。
什么时候根本不该转成 STL
- 你的切片软件可能并不需要你转。较新版本的 PrusaSlicer 和 Bambu Studio 可以直接打开 OBJ,如果你的流程就到切片为止,先试着直接拖进去,省掉这一道。
- 要打彩色或者多材料,请改用 3MF。STL 会把颜色丢掉,而且之后再也没法从 STL 里把颜色找回来。
- 想把模型当成带尺寸、带特征的实体来修改,任何网格格式都帮不了你。OBJ 和 STL 都是三角网格,在两者之间转换永远不会得到 STEP 或原生 CAD 文件那种可编辑的实体。
- 如果网格有破洞、法线翻转或自交,转换一个都不会修。我们实测三角面数是一比一照搬的,所以之前切片软件不收的模型,转完照样不收。先修再转。
- 如果你只是想看看文件或量一下尺寸,用查看器比转换快得多。
想自己在电脑上做同一件事
- Blender 两边都能读写:文件、导入、Wavefront OBJ,然后文件、导出、STL。STL 导出面板里有场景单位的选项,这是处理米制模型最省事的地方,在它进切片软件之前就搞定。
- 想先看看结果,Blender 也能替你三角化。加一个 Triangulate 修改器,或者在 OBJ 导出时勾上三角化网格,那时你看到的面数就是最终的三角面数。
- 如果 OBJ 是很重的扫描网格,MeshLab 更合适,它打得开非常大的网格,也带着你打印前会想用的减面滤镜。
- PrusaSlicer 和 Bambu Studio 都能导入网格再把整个热床导出成文件,所以在流程末端,切片软件本身就能当转换器用。
本站的限制,以及你的文件会怎样
- 免费:每个文件最大 30 MB,每小时 10 次转换,同时最多 2 个任务,不需要注册。
- Pro:每个文件最大 1 GB,每小时 50 次转换,同时最多 5 个任务。
- 上传的文件和转换结果会在上传后 1 小时内从我们的服务器上删除。
- 从 OBJ 出发,本站可以转成 STL、GLB、GLTF、FBX、DAE、PLY 和 USDZ。如果颜色或贴图必须保住,就从这些里面挑一个,不要选 STL。
2026 年 10 月 29 日实测:用 Blender 5.1 生成一个 8,685 字节的 OBJ,含两个命名对象、72 个顶点、40 个面(其中 38 个四边面和 2 个 32 边形端面)、一个外部 MTL 里的两种材质、每个对象各一套 UV,并以米为单位建模。在本站转换成 6,884 字节的二进制 STL,再导回 Blender 清点三角面、顶点、对象、材质和尺寸,并与两个文件里的原始坐标逐一核对。