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.