作者:Huy Nguyen · ·
需要把 STL 转成 OBJ,通常是因为下游的东西更想要 OBJ:渲染器、老一些的游戏流程、学校作业、处理网格的脚本,或者某个导入 OBJ 比导入 STL 干净得多的建模软件。如果你想给一个可打印的模型加上 UV 和材质,这也是第一步,因为 STL 根本没有地方放这些。
这个转换是温和的,因为 OBJ 能装下 STL 的全部内容,还能装更多。问题在于,转换并不会把多出来的空间填满。你拿到的还是同一批三角面,只是描述得更好,另外还有几个关于下载文件夹里到底多了什么的实际意外。
我们今天用这个页面背后同一个转换器跑了两个 STL 文件,把结果解压、逐行读过,再导回 Blender 5.1 核对。下面的数字都来自这次实测。
两次实测保住了什么,丢了什么
第一个输入是从 CAD 导出的支架,51,684 字节的二进制 STL:1,032 个三角面,由 516 个不重复顶点构成,是一块 40 x 20 x 10 毫米、带孔和倒圆边的板。第二个是扫描状网格,320 个三角面、162 个顶点,16,084 字节,以米为单位建模。两个的表现完全一致。
| 输入 | 输出 | 结论 |
|---|---|---|
| 1,032 个三角面 | 1,032 个三角面 | 完全保住。没有减面、没有平滑、没有重新拓扑 |
| 3,096 条顶点记录,其中 516 个不重复 | 516 行顶点加一份索引表 | 变好了。重复的角点被合并成一个共享顶点 |
| 每个三角面一条平面法线 | 291 行法线,每个面指向其中一条 | 保住了。相同的面法线会被共用而不是反复写 |
| 没有颜色也没有材质,因为 STL 本来就没有 | 一个不含任何材质的配套 MTL 文件 | 诚实。没有凭空造出什么来填空 |
| 没有纹理坐标 | 没有纹理坐标 | 没变。OBJ 有放 UV 的地方,但本来就没有 UV 可带 |
| 40 x 20 x 10 毫米 | 还是 40、20、10,但高度换到了 Y 轴上 | 保住了,并且按 OBJ 以 Y 轴为上的惯例书写 |
| 一个没有名字的实体 | 一个用自动生成临时名字的对象 | 能用,但你会想重命名 |
| 51,684 字节二进制 STL | 一个 10,519 字节的 ZIP,里面是 50,131 字节的 OBJ | 下载小了 80%,但里面的 OBJ 并没有变小 |
你下载到的是 ZIP,而且这是故意的
这一点最容易让人困惑,所以先说:转成 OBJ 拿到的是一个 ZIP 压缩包,不是一个裸的 .obj 文件。解压后会看到两个文件,我们这次测试里是 bracket.obj 和 bracket.mtl。
原因是 OBJ 从来就不是一个文件。几何数据在 .obj 里,材质在旁边的 .mtl 里,靠 .obj 开头的一行 mtllib 来引用。只给你 .obj 的转换器,等于给了你一个带着断掉引用的文件,所以两个要打包在一起。
导入时请把这两个文件放在同一个目录下。大多数软件会按 .obj 里写的那个名字,在同一个文件夹里找 .mtl,找不到就默默放弃。
里面的 MTL 是空的,而这是对的
我们拿回来的 bracket.mtl 只有 51 字节:两行注释,别的什么都没有。里面没有任何材质定义块,OBJ 里也没有指向材质的 usemtl 行。
这是诚实的结果,不是故障。STL 文件没有颜色、没有材质、没有贴图,所以没有东西可以翻译过去。要是转换器拿一个凭空编的灰色材质把这个空档填上,那就是在替你的模型编造数据。
对你来说很简单:想要材质,就在转换之后自己加,在 Blender 或者你导入的那个软件里加。这个空的 MTL 是留给你写进去的位置,不是哪里出错了。
重复顶点会被合并,这才是真正的好处
二进制 STL 会为每个三角面完整写下三个顶点坐标,并且不保存共享顶点表,所以六个三角面交汇的一个角点会被写六遍。我们的支架因此存了 3 乘 1,032,也就是 3,096 条顶点记录,而这个形状其实只有 516 个不同的角点。
转出的 OBJ 只有 516 行 v,然后按索引引用它们,这正是 OBJ 的设计方式。扫描网格也一样:进去 960 条记录,出来 162 行 v。导回 Blender 后,两个的顶点数正好就是这些,坐标也没有变化。
如果你打算对网格做任何处理,这一点很关键。顶点合并之后,你才能选中一圈边、平滑一个表面、展开 UV 或者跑减面滤镜,而网格不会散成一堆互不相连的三角片。这也是网格处理类工具普遍更喜欢 OBJ 或 PLY 而不是 STL 的主要原因。
三角面还是三角面:四边面回不来
输出 OBJ 里全部 1,032 个面都是三边的。如果你的 STL 来自一个原本有四边面的模型,它们不会被还原,而且没有任何转换器能还原,因为 STL 已经把哪两个三角面原本是同一个面这件事扔掉了。
曲面也一样。我们支架上的倒圆边在 OBJ 里就是一片平的三角面,和它在 STL 里的样子一模一样。没有重新平滑,也没有恢复任何曲率。
如果你需要四边面,那是重新拓扑,属于建模工作:试试 Blender 的 Remesh 修改器或者某个重拓扑插件,或者 MeshLab 里相应的滤镜。如果你需要真正的曲面回来,那你需要的是原始的 CAD 文件,而不是一个转换过的网格。
OBJ 能装的东西,你这个文件并没有装满
OBJ 支持纹理坐标、命名材质、多个命名对象和平滑组。从 STL 转过来,这些全是空的,因为 STL 从来没有过。这不是转换的缺陷,这恰恰是人们转换的原因。
更有用的理解方式是:这个转换给你的是一个可以开始往里加东西的文件。导入这个 OBJ,展 UV、指定材质、拆成几个部件、给它们起名字,再导出成 OBJ。几何数据锁在 STL 里的时候,这些一样都做不了。
朝向,以及那个奇怪的对象名
OBJ 的惯例是以 Y 轴为上,转换器遵守了这一点。我们的支架是 40 x 20 x 10 毫米,在 STL 里那 10 毫米的高度在 Z 轴上,而在输出的 OBJ 里这个 10 换到了 Y 轴。毫米数值本身一点没动。
Blender 自己处理得很好:用默认的 OBJ 导入选项,支架进来后在世界空间里是 40 x 20 x 10,方向是正的。我们试着把上轴强行改成 Z,那才会得到一个躺平的零件,量出来是 40 x 10 x 20。所以除非模型真的是平躺着进来的,不要去动导入的轴向设置。
有一个纯外观上的别扭处:OBJ 里那个对象用的是自动生成的临时名字,不是你上传的文件名,所以在大纲视图里会显示成一长串数字。导入后重命名一下,或者用任意文本编辑器打开 .obj,改开头那一行 o。
文件体积:下载变小了,OBJ 本身没有
你收到的 ZIP 比原来的 STL 小很多:10,519 字节对 51,684 字节,小了约 80%。这是 ZIP 压缩在高度重复的文本上发挥作用。
里面的 OBJ 就是另一回事了。解压后它是 50,131 字节,和来源的 51,684 字节 STL 基本一样。把 3,096 条顶点记录合并成 516 个所省下的量,差不多正好被用十进制文本而不是二进制浮点写坐标的开销抵消。扫描网格的表现一模一样:进去 16,084 字节,出来 15,260 字节的 OBJ。
所以不要指望转成 OBJ 能得到更小的工作文件。转成 OBJ 是因为你想要一个带索引、可编辑的网格。如果目标就是体积,PLY 或 GLB 既保留顶点合并又仍然是二进制。
什么时候不该把 STL 转成 OBJ
- 如果目标软件本来就能读 STL,就别转。Blender、MeshLab、CloudCompare、所有切片软件和大多数 CAD 都能直接导入 STL,转一遍什么也不会多出来。
- 如果你指望拿回一个可编辑的 CAD 实体,这做不到。换个容器并不能让网格变成参数化实体,换成哪种网格格式都一样。你需要的是原始的 STEP 或原生 CAD 文件。
- 如果你想要颜色,没有颜色可以恢复。STL 从来没存过颜色,所以 OBJ 带着一个空材质文件过来。颜色只能之后手工加。
- 如果你只想看看或者量一下模型,请用查看器。为了同一个答案去跑一次转换是更慢的做法。
- 如果你想把文件变小,OBJ 是走错方向了。解压之后它和 STL 差不多大。
想自己在电脑上做同一件事
- Blender 是最直接的路子:文件、导入、STL,然后文件、导出、Wavefront OBJ。导出面板里有法线、UV、是否三角化这些选项,而且它也会把 .mtl 写在 .obj 旁边。
- 我们的测试 STL 导入 Blender 时被合并成了 516 个顶点,但来自 3D 扫描仪的 STL 可能存在小数末位略有差异的重复角点,那些是不会自己合并的。需要合并的话,在编辑模式下全选,用网格、合并、按距离,然后再导出。
- 网格很大或者是扫描数据时,MeshLab 更合适。导入 STL,然后用 Export Mesh As 写出 OBJ,里面有勾选框决定带上哪些逐顶点属性。
- FreeCAD 也能做,走它的 Mesh 工作台。如果这个 STL 本来就属于你手上打开着的工程项目,这条路很方便。
本站的限制,以及你的文件会怎样
- 免费:每个文件最大 30 MB,每小时 10 次转换,同时最多 2 个任务,不需要注册。
- Pro:每个文件最大 1 GB,每小时 50 次转换,同时最多 5 个任务。
- 上传的文件和转换结果会在上传后 1 小时内从我们的服务器上删除。
- 从 STL 出发,本站可以转成 OBJ、GLB、GLTF、FBX、3MF、DAE 和 PLY。我们今天这两个测试文件都是二进制 STL,也是多数软件写出来的形式。
2026 年 10 月 29 日用两个二进制 STL 实测:一个是来自 CAD 的支架,1,032 个三角面、516 个不重复顶点,尺寸 40 x 20 x 10 毫米;另一个是以米为单位的扫描状网格,320 个三角面。两个都在本站转换,返回的 ZIP 被解压后逐行清点了 OBJ 和 MTL 的内容,两个网格也都导回 Blender 5.1 核对了顶点数、面数和尺寸。