OBJ and MTL

Ancient, simple, universally readable. What it carries, what it drops, and why it is still around.

OBJ is a plain-text geometry format from the 1980s. It carries very little and every tool ever written can read it.

What it carries

  • Vertex positions, normals and texture coordinates
  • Faces, including n-gons
  • Groups and object names
  • A reference to an MTL file for materials

What it does not

  • Animation. None at all.
  • Skeletons or skinning. None.
  • PBR materials. MTL describes a pre-PBR model — diffuse, specular, ambient. Some extended conventions exist and are not universally supported.
  • Scene hierarchy, beyond flat groups.
  • Units. There is no unit information whatsoever.

The MTL file

Materials live in a separate .mtl file, which itself references texture images as separate files. So a "model" is three or more files that must travel together, and the paths inside them are frequently absolute — which is why an OBJ arrives with no textures more often than any other format.

Where it is still right

  • Simple static geometry going somewhere old
  • 3D printing workflows that want colour, where STL cannot carry it
  • Point-cloud-adjacent and scanning tools
  • Anywhere human-readable output is genuinely useful

Why generated OBJ output is usually zipped

Because it is never one file. An OBJ export is the .obj, the .mtl, and one image per texture — so distribution bundles them, and a manifest listing "OBJ" typically means an archive rather than a single mesh file.

Practical advice

If something reads GLB, send GLB. OBJ is a compatibility fallback, and choosing it deliberately usually means the destination is old or the pipeline is simple enough that losing materials does not matter.