STL vs OBJ vs 3MF: Which 3D File Format Should You Use?
Use STL for a single-color print you just need to slice, OBJ when the model carries textures for rendering or a game engine, and 3MF when your slicer supports it and you want units, colors and several parts to survive the trip. The format decides what metadata travels with the mesh; it never decides whether the mesh itself is sound.
STL: a list of triangles and nothing else
STL was written in 1987 for 3D Systems' first stereolithography machines, and its design shows that origin. A file is a flat list of triangles, each described by a facet normal and three corner points. There is no shared vertex table, so a corner touching six triangles is written six times. There is no unit field either: a coordinate of 25 might mean millimeters, inches or meters, and almost every slicer guesses millimeters. Color, texture and part names have no place in the core format, which is exactly why every slicer, CAD package and print service still reads it.
STL comes in two encodings. ASCII STL spells everything out in text, with lines like facet normal, outer loop and vertex 12.5 0 3.2, so you can open it in a text editor and read the numbers. Binary STL starts with an 80-byte header and a 4-byte triangle count, then stores each triangle as twelve 4-byte floats plus a 2-byte attribute field: exactly 50 bytes per triangle. That rule makes size easy to predict. A one-million-triangle model is about 50 MB as binary, and the ASCII version of the same mesh is typically four to six times larger because every digit becomes a character.
The simplicity is both the strength and the trap. An STL cannot tell you whether it was meant to be one part or three, whether it was exported in inches, or whether its triangles actually enclose a solid. The slicer works that out from raw coordinates, and when it guesses wrong you get a part 25.4 times too small or a missing wall. For a single-color part you designed yourself and exported in millimeters, none of that matters, and STL remains the format least likely to be rejected.
OBJ: polygons, UVs and a sidecar material file
OBJ comes from Wavefront Technologies, whose Advanced Visualizer software used it in the late 1980s, and it spread through the 1990s as the plain-text format almost every 3D program could exchange. Unlike STL it keeps a vertex list and builds faces from indices, so a shared corner is stored once, and faces can be triangles, quads or larger polygons. Lines starting with v hold positions, vt texture coordinates (UVs), vn normals and f the faces. Groups (g) and objects (o) name the parts, so OBJ survives a round trip through Blender, Maya or ZBrush with its structure intact.
Appearance lives outside the .obj file. A mtllib line names a companion .mtl file, and usemtl lines assign materials to faces. The .mtl file stores colors such as Kd (diffuse) and points at texture images with entries like map_Kd wood.png. A textured OBJ is therefore at least three files: the geometry, the material library and one or more images, all referenced by relative path. Send only the .obj and the receiver sees a gray model. That separation is useful in game and VFX pipelines where artists swap textures without touching geometry, and it is the single most common reason a downloaded model looks wrong.
OBJ shares STL's blind spot on scale: it stores bare numbers with no unit. Most modeling tools write meters or centimeters, while slicers read millimeters, so an OBJ from a game asset store can arrive 10 or 1,000 times off. For printing, OBJ adds nothing a slicer uses except per-vertex color in a few tools, so if you need to print an art asset it is usually simplest to keep the textures for rendering and send the slicer a clean mesh. Going the other way, turning an STL into an OBJ is the shortest route from a print model into a rendering or game workflow.
3MF: a ZIP package built for printing
3MF was published in 2015 by the 3MF Consortium, a group started by Microsoft with companies from the printing and CAD industry. A .3mf file is a ZIP archive, the same container format discussed in ZIP vs RAR vs 7z. Rename one to .zip and you find a 3D/3dmodel.model XML file with the mesh, a content-types file, relationship files and often thumbnails and slicer configuration. Every model declares its unit (micron, millimeter, centimeter, inch, foot or meter), so the scale problem that dogs STL and OBJ simply does not occur. Colors, base materials, several objects and their placement on the build plate are all part of the specification.
The specification also requires meshes to be manifold and consistently oriented: every edge shared by exactly two triangles, all of them facing outward. Exporters that follow the rules cannot write the open, self-intersecting geometry an STL happily carries. Support is broad among current tools. PrusaSlicer, Bambu Studio, OrcaSlicer and UltiMaker Cura read 3MF, PrusaSlicer and Bambu Studio save their whole project as a .3mf with print settings and painted colors inside, and Microsoft's 3D Builder app on Windows opens it directly. The weak spot is older firmware, print-farm portals and CAD importers that still expect STL; for those, convert the 3MF to STL and accept that the extras stay behind.
| from ↓ · to → | Units | Color | Textures | Multiple parts | Print settings | Manifold rule |
|---|---|---|---|---|---|---|
| STL | – STL to Units: no | – STL to Color: no | – STL to Textures: no | – STL to Multiple parts: no | – STL to Print settings: no | – STL to Manifold rule: no |
| OBJ | – OBJ to Units: no | OBJ to Color: yes | OBJ to Textures: yes | OBJ to Multiple parts: yes | – OBJ to Print settings: no | – OBJ to Manifold rule: no |
| 3MF | 3MF to Units: yes | 3MF to Color: yes | 3MF to Textures: yes | 3MF to Multiple parts: yes | 3MF to Print settings: yes | 3MF to Manifold rule: yes |
Matching the format to the job
The right format depends on where the file goes next, not on which one is newer. If the next stop is a slicer and the part is a single color, STL is fine, and it is still the format every forum, model library and print service understands. If the next stop is a renderer, a game engine or another artist's modeling tool, OBJ keeps the UVs, normals and named groups that STL throws away, and its text form makes problems easy to inspect.
3MF earns its place when the file carries more than geometry. A multi-color print painted in Bambu Studio, a plate of twelve parts arranged for one job, a part designed in inches, or a project you want to reopen with the same layer height and infill all need 3MF, because no other format here can hold that information. Across several destinations, keep the richest version as your master copy and export simpler ones from it with a 3D model converter instead of chaining conversions.
STL for plain prints
One part, one color, exported in millimeters. Opens in every slicer, CAD import dialog and print-service upload form.
OBJ for textured models
UVs, normals and named groups for Blender, Maya, Unity or Unreal. Ship the .mtl file and texture images alongside it.
3MF for modern slicers
Real units, colors, several objects and print settings in one ZIP. Native project format of PrusaSlicer and Bambu Studio.
Five ways a 3D file goes wrong
Most failed prints and broken imports blamed on the format are really problems in the mesh, or in what the receiving program assumed about it. STL is the most exposed because it carries no metadata to catch mistakes; OBJ shares the scale and missing-file problems; 3MF avoids most of them by design, though a careless exporter can still write a bad mesh. Open the rows below for what each failure looks like and where it usually comes from.
Non-manifold mesh
Edges shared by one triangle or by three or more, gaps between surfaces, or walls with zero thickness. The slicer shows missing layers, random holes or a warning about open edges. The cause is in the modeling or export, often from merging parts that only touch.
Inverted normals
Some triangles face inward. Renderers show black or see-through patches, and slicers may treat the region as empty space. A recalculate-normals command in Blender, Meshmixer or the slicer's repair tool fixes it.
Millimeter and inch mix-ups
A part drawn in inches arrives 25.4 times too small in a slicer that assumes millimeters; centimeters read as millimeters give a 10 times error. STL and OBJ cannot record the unit, so you set it when exporting or converting.
Missing .mtl file or textures
An OBJ that loads gray or magenta has lost its material library or its images, or the paths inside the .mtl point to a folder on the original artist's computer. Keep all files in one folder and zip them together.
Huge ASCII STL files
A detailed scan saved as ASCII STL can pass several hundred megabytes, which slows slicers and hits upload caps. Re-exporting the same mesh as binary STL shrinks it to roughly a fifth without changing a single triangle.
How big each format typically gets
Size follows from structure. Binary STL is fixed at 50 bytes per triangle, so you can calculate it before export. ASCII STL repeats each corner as text and usually lands four to six times above binary. OBJ stores each shared vertex once and refers to it by index, so for a typical closed mesh it comes out smaller than ASCII STL and roughly in the range of binary STL, larger if it also carries UVs and normals. 3MF stores indexed XML and then compresses it inside the ZIP, which usually makes it the smallest of the three for the same geometry.
The figures below are typical for a closed mesh of about 500,000 triangles, such as a detailed figurine. Real files vary with coordinate precision and exporter, so treat them as orders of magnitude, useful when a print service caps uploads or an STL exported from a 3MF comes out several times bigger.
- Binary STL (500,000 triangles × 50 bytes)
- ≈ 25 MB
- ASCII STL, same mesh, typical
- ≈ 100–150 MB
- OBJ without UVs, typical
- ≈ 15–30 MB
- 3MF after ZIP compression, typical
- ≈ 5–12 MB
What converting fixes and what it never will
A conversion reads the triangles from one container and writes them into another. Anything the target format can express comes along; anything it cannot is dropped. That is why STL to OBJ is lossless for geometry, 3MF to STL loses colors, units and plate layout, and OBJ to STL loses textures and part names. In the 3D tools on UltKit, the extra decisions are explicit: Model units tells the converter what scale the source uses, Up axis handles the Y-up versus Z-up difference between game engines and slicers, and Merge into one mesh decides whether separate parts stay separate.
What no conversion does is repair a mesh. If an STL has a hole, the OBJ you make from it has the same hole, and a 3MF exporter will either refuse it or write it anyway. Repair is a separate step in a mesh tool or the slicer's built-in fixer, and it is best done once, in your master file, before you export anything else. The same goes for scale: converting cannot know that a part was meant to be in inches unless you tell it. Detail works the same way: a low-polygon STL becomes a low-polygon OBJ or 3MF, so export again from the source model when quality matters.
What a format change does
- Moves the same triangles into a container another program accepts
- Applies the unit you choose under Model units, fixing a 25.4× or 10× scale error
- Rotates the model between Y-up and Z-up with Up axis
- Shrinks an ASCII STL by writing binary instead
- Keeps or merges separate parts, depending on Merge into one mesh
What it leaves exactly as it was
- Holes, open edges and non-manifold geometry
- Inverted or inconsistent normals
- Self-intersecting parts and zero-thickness walls
- Detail that was lost when the mesh was first exported
- Colors and textures when the target format has no place for them
Decision table: STL, OBJ or 3MF
Two other formats come up whenever this question is asked. STEP (ISO 10303) stores exact solids and surfaces rather than triangles, so it is the format to use when a part needs to go back into Fusion 360, SolidWorks or FreeCAD for editing. GLB, the binary form of the Khronos Group's glTF 2.0, packs a mesh with its materials and textures into one file in meters and is the format for showing a model on the web or in Android AR.
For the three formats this article covers, the table below sums up the choice by destination. If two rows fit, pick the format that carries more information and export the simpler one later; going from 3MF to STL is easy, while rebuilding lost colors or units is manual work.
| Situation | Best format | Why |
|---|---|---|
| Single-color part going to any slicer | STL (binary) | Universal support; the slicer needs nothing else |
| Uploading to a model library or print service | STL, plus 3MF if offered | STL is always accepted; 3MF keeps units and colors |
| Multi-color or multi-material print | 3MF | Only format here that stores colors and per-part materials for slicers |
| Plate of several parts with print settings | 3MF | Stores object placement and slicer settings in one file |
| Part designed in inches | 3MF | Declares the unit, so nothing is scaled by 25.4 |
| Textured model for Blender, Unity or Unreal | OBJ (+ .mtl and images) | Keeps UVs, normals and material assignments |
| Quick check in a text editor | OBJ or ASCII STL | Plain text you can read line by line |
| Old firmware or software that only lists STL | STL | Strip the extras and send the mesh |
Key takeaways
- STL stores only triangles: no units, no color, and 50 bytes per triangle in its binary form.
- OBJ adds UVs, normals and named groups, but its colors and textures depend on a separate .mtl file and image files.
- 3MF is a ZIP of XML that records units, colors, several objects and print settings, and requires closed meshes.
- Use STL for plain single-color prints, OBJ for textured models in art and game pipelines, and 3MF whenever your slicer supports it.
- Converting changes the container, not the mesh: repair holes and normals in a mesh tool, and set the unit yourself.
Frequently asked questions
Is STL being replaced by 3MF?
Slowly, for printing workflows. PrusaSlicer and Bambu Studio already save projects as 3MF, but STL remains the format every tool and model library accepts, so the two will coexist for years.
Can a binary STL store color?
Not in any standard way. A few programs write color into the 2-byte attribute field of each triangle, but most slicers ignore it, so use 3MF or OBJ when color matters.
Why does my OBJ show up gray after I download it?
The .mtl file or the texture images were left behind, or the paths inside the .mtl point to folders that do not exist on your computer. Put the .obj, .mtl and images in one folder and load the model again.
Does ASCII or binary STL give a more accurate print?
Neither prints more accurately in practice. Both describe the same triangles; binary stores coordinates as 32-bit floats and ASCII as text, and binary files are typically several times smaller.
Can I turn an OBJ back into an STL for printing?
Yes. The triangles carry over unchanged, while UVs, materials and textures are dropped because STL has no place for them. Check the scale afterward, since OBJ files from modeling tools are often in meters or centimeters.
Which format should I use to share a model for others to print?
Offer an STL for the widest compatibility and, if the model has several parts, colors or was designed in inches, add a 3MF next to it so people with a modern slicer get the full setup.
Keep reading
ZIP vs RAR vs 7z: Which Archive Format Should You Use?
ZIP opens on every computer and phone, 7z packs smallest and hides file names, RAR adds recovery records. Compare compression, encryption, OS support and limits.
Lucas Ferreira · Sep 27, 2026 · 11 min read
TTF vs OTF vs WOFF: Which Font Format to Install or Put on the Web
Install TTF or OTF on Windows, macOS and Linux; serve WOFF2 on websites with WOFF as a fallback. What each font format holds, how big files run and what converting changes.
Jonas Weber · Sep 10, 2026 · 11 min read
How to Convert PNG to SVG: Tracing Logos, Icons and Line Art
A PNG only becomes a real SVG through tracing. Learn which images trace well, how to prepare the PNG, which color and threshold settings to pick, and how to check the paths.
Jonas Weber · Oct 4, 2026 · 12 min read