What changes when STL becomes OBJ
An STL stores every triangle on its own: three corner positions and a normal, with no idea that the corner of one triangle is the same point as the corner of its neighbour. An OBJ stores each vertex once and then lists faces as references to those vertices. So the conversion is mostly a merge: the tool reads all the triangles, finds corners that share the same position, gives each unique position one v line, and writes one f line per triangle pointing at three of them. Normals are recomputed from the merged surface and written as vn lines, so shading in the receiving program is smooth where the surface is smooth and sharp where it is sharp.
Why do this at all? Because a lot of software prefers OBJ: Blender, Maya, Unity and most game and rendering tools import it with sensible defaults, some CAD packages will only import mesh data as OBJ, and OBJ is text, so a script can read it. STL is what the printer wants; OBJ is what the modelling tool wants.
Like every tool on this site, the work happens in your browser. The file is read from your device, parsed in memory and drawn with WebGL; no copy is sent anywhere. Open the network panel of your browser's developer tools while you load a model and you will see no upload. Close the tab and the model is gone.
Worked example: a 40 mm calibration cube
A binary STL of a 40 mm cube, cube.stl, is 684 bytes: an 80-byte header, a 4-byte count and 12 triangles at 50 bytes each. Each triangle carries its own three corners, so the file holds 36 vertex records for a shape with 8 corners.
- Drop the file. The preview shows the cube and the status line reads
12 triangles,8 vertices,40.0 x 40.0 x 40.0 mm,watertight: yes. The vertex count is already the merged count. - Click Download OBJ. The file you get starts like this:
# cube.stl converted by stlvieweronline.com
v 0 0 0
v 40 0 0
v 40 40 0
v 0 40 0
v 0 0 40
v 40 0 40
v 40 40 40
v 0 40 40
vn 0 0 -1
...
f 1//1 3//1 2//1
f 1//1 4//1 3//1
...Eight v lines instead of thirty-six positions, twelve f lines, and a handful of vn lines. OBJ indices start at 1, not 0, which is the single most common bug in home-made converters and the reason a face line reads 1//1. The double slash means there is no texture coordinate, because STL has none.
The same idea scales. A 100,000-triangle binary STL is 5,000,084 bytes; as OBJ it typically holds about 50,000 vertices and lands somewhere between 3 and 6 MB depending on how many decimal places the coordinates need, since text is bulkier per number than a 4-byte float but there are a third as many positions to write.
Things to check before you convert
- Size. OBJ has no units either. The dimensions panel shows the model in mm and inches; if the cube reads
1.575instead of40, the STL was exported in inches and the OBJ will carry the same numbers. - Open edges. Merging vertices does not close holes. If the STL reports open edges, the OBJ will have the same open edges.
- Precision. Coordinates are written with enough decimals to round-trip a 32-bit float, which is what STL stores. Nothing is lost, but nothing is gained: an STL exported at coarse tolerance stays faceted.
- Normals. If the STL had flipped triangles, run STL repair first, then convert, so the OBJ shades correctly.
Limitations
- No materials or texture coordinates are written, because STL has none. The OBJ references no .mtl file.
- Vertices are merged by exact position match. Two corners a few microns apart stay separate; the repair tool merges within a small tolerance if you need that.
- Output is triangles only; the converter does not rebuild quads.
- The whole STL is read into memory; files over a few hundred MB may not convert on a phone.
- One file at a time.
Last updated 2026-09-16. Runs in your browser; nothing is uploaded.