What Is an OBJ File? The Wavefront Format and Its Two-File System Explained
The most universally compatible 3D format from 1992 — and why the .mtl companion file causes more trouble than the geometry ever does.
Updated Mar 2026
What Is an OBJ File?

OBJ (Wavefront Object) is a 3D geometry format created by Wavefront Technologies in the early 1990s for their animation software "The Advanced Visualizer." In 1995, Silicon Graphics acquired Wavefront (and its rival Alias Research), but the OBJ format outlived both companies to become the most universally compatible 3D exchange format in existence — supported by virtually every 3D application made in the last three decades.
Unlike STL, which stores only raw triangulated geometry, OBJ stores geometry with optional UV texture coordinates, vertex normals, and material references. The material definitions themselves live in a separate companion file with the `.mtl` extension (Material Template Library) — this two-file system is both OBJ's greatest strength and its most common source of confusion.
OBJ is a plain ASCII text format. Open any OBJ file in a text editor and you will see human-readable lines: `v 1.0 0.0 0.0` (a vertex at position x=1, y=0, z=0), `vt 0.5 0.5` (a UV texture coordinate), `f 1/1 2/2 3/3` (a triangular face using vertex 1, texture coord 1, vertex 2, texture coord 2, and vertex 3, texture coord 3). This human-readability is why OBJ has been the format of choice for debugging, research, and teaching 3D graphics for 30 years.
As a format designed in the early 1990s and documented in version 4.2 (October 1995), OBJ has never received a major update. This frozen-in-time design is simultaneously its greatest strength (nothing will ever break compatibility) and its most significant limitation (no PBR materials, no animation, no modern scene concepts).
The OBJ + MTL Two-File System
When an OBJ file references materials, it points to a .mtl file using the `mtllib` directive. The MTL file defines surface properties: ambient color (Ka), diffuse color (Kd), specular color (Ks), specular exponent (Ns), transparency (d/Tr), and texture map file references (map_Kd for diffuse texture, map_Ks for specular, map_bump for normal maps, etc.). A single OBJ can reference multiple MTL files; a single MTL file can define multiple named materials.
The two-file system works well within a single project directory but creates predictable problems during file transfer: if you email just the .obj file and forget the .mtl, the recipient sees a gray, textureless model. If you include the .mtl but not the texture images it references, materials appear as flat colors. If the directory structure changes, all relative paths in the MTL break. This is why best practice is always to zip the .obj file, its .mtl file, and all texture images together before sharing.
MTL was designed for Phong shading — the rendering model of 1990s workstations. It has no concept of physically-based rendering (PBR) roughness/metalness maps. The Clara.io team proposed a PBR extension (adding `Pr`, `Pm`, `Ke`, and other parameters), subsequently adopted by Blender and TinyObjLoader — but this extension is not universally supported. This means OBJ/MTL cannot reliably represent modern game-quality materials across all applications.
Important: Polyvia3D's OBJ converter handles the two-file system automatically. When you download a converted OBJ file from Polyvia3D, materials and texture references are preserved. When you convert TO OBJ, the output includes both the .obj and .mtl files packaged together.
Technical Structure — What Is Inside an OBJ File
An OBJ file is structured as a series of keyword-prefixed lines. The key directives: `v` (geometric vertex — x, y, z coordinates, optional w for rational curves), `vt` (texture coordinate — u, v, optional w for 3D textures), `vn` (vertex normal — x, y, z direction vector), `f` (face — references to vertex/texture/normal indices, can be triangles or polygons), `g` (group — named subset of geometry), `usemtl` (switch to a named material defined in the MTL file), and `mtllib` (reference to one or more MTL files).
OBJ uses 1-based indexing for all references. Face references can use absolute indices (`f 1 2 3`) or relative indices (`f -3 -2 -1`, counting from the current position). Not all software supports relative indexing, which can cause import failures. When in doubt, use absolute indices.
OBJ supports polygon faces (not just triangles) — a single `f` line can reference 4, 5, or more vertices. Most rendering and printing workflows require triangulated meshes, so OBJ files are often auto-triangulated on import. This triangulation is lossy if the original polygon had more than 3 vertices — the triangulation algorithm must choose how to split the polygon, and different software may choose differently.
File size context: OBJ is an uncompressed ASCII format, making it substantially larger than equivalent binary formats. A 1MB GLB (binary, optionally Draco-compressed) might expand to a 5–10MB OBJ file with separate texture images. For web delivery, OBJ's size is a significant disadvantage compared to GLB.
What OBJ Cannot Store — Critical Limitations
Animation: OBJ has no animation support whatsoever — no keyframes, no skeletal rigging, no morph targets, no blend shapes. If your workflow includes animated characters or objects, OBJ is structurally unable to carry that data. Use FBX (for game engine pipelines) or GLTF/GLB (for web-based animation).
Scene hierarchy: OBJ can group geometry with `g` directives, but has no concept of a scene graph — parent/child object relationships, transforms at the object level, or scene metadata. A complex scene with dozens of objects, cameras, and lights cannot be represented in OBJ beyond a flat collection of geometry groups.
Modern PBR materials: The Phong shading model in MTL predates modern game and film rendering. Roughness, metalness, ambient occlusion maps, and subsurface scattering — the building blocks of modern physically-based rendering — have no standardized representation in OBJ/MTL. The PBR extension exists but lacks universal support.
Multiple objects as separate files: OBJ combines all geometry into one file. There is no concept of referencing external mesh files or instancing. A scene with 1,000 identical chairs requires each chair's geometry to be duplicated 1,000 times in the file.
When OBJ is the wrong tool: Real-time web display (use GLB instead — smaller, binary, animations supported). Animated characters for game engines (use FBX). Multi-material prints on modern 3D printers (use 3MF). Preserving complex scene hierarchies from Maya or 3ds Max (use FBX or the application's native format). Large models for fast web loading (use GLB with Draco compression).
When OBJ Is the Right Choice

Academic and research workflows: OBJ's ASCII format and 30-year universal support make it the lingua franca of 3D research. Stanford 3D Scanning Repository models are distributed as OBJ. If you need to load a model in a custom renderer, script, or research pipeline, OBJ is the safest format choice.
3D printing with color (FDM/polyjet): OBJ + MTL supports diffuse color and texture maps, making it a viable format for full-color 3D printers (like Stratasys PolyJet or multi-filament FDM). When color matters but you cannot use 3MF, OBJ is the conventional alternative.
Long-term archival: OBJ's simplicity is a preservation asset. The format is fully documented, has no proprietary elements, and requires only a text editor to read. Files saved today will be readable by software 50 years from now. For archiving 3D models, OBJ's longevity is unmatched.
Cross-software geometry exchange: When you need to move geometry — particularly textured geometry — between different 3D applications (Blender, Maya, 3ds Max, Cinema 4D, ZBrush, Houdini), OBJ remains the most reliably compatible interchange format. Most import/export pipelines have been tested against OBJ for decades.
Product visualization for e-commerce: Static product renders, 3D asset libraries, and visualization pipelines that do not require animation often use OBJ + MTL as the source format, converting to GLB or USDZ for actual web or AR delivery.
Software Compatibility with OBJ Files
| Tool | Type | Notes |
|---|---|---|
| Blender | Desktop (free) | Full OBJ + MTL import/export, PBR extension supported |
| Maya / 3ds Max | Desktop (commercial) | Full support — OBJ/MTL is native interchange format |
| ZBrush | Desktop (commercial) | Primary import/export format for sculpting workflows |
| Cinema 4D | Desktop (commercial) | Full OBJ import/export |
| Unity / Unreal Engine | Game Engine | OBJ import supported; GLB/FBX preferred for production |
| MeshLab | Desktop (free) | Full OBJ import; good for analysis and repair |
| Polyvia3D Viewer | Browser (free) | Instant OBJ viewing with MTL material support |
| Polyvia3D Converter | Browser (free) | OBJ ↔ STL, GLB, PLY, 3MF, and more |