What Is OBJ Format?
OBJ (Wavefront Object) is a plain-text 3D model format developed by Wavefront Technologies in the late 1980s for their Advanced Visualizer animation software. Despite its age, OBJ remains one of the most universally supported 3D file formats because of its simplicity, human readability, and broad compatibility with virtually every 3D application on the market.
The OBJ specification defines geometry through vertices, texture coordinates, surface normals, and polygonal faces. Material properties are defined in a companion MTL (Material Template Library) file. Together, OBJ + MTL form a self-contained 3D asset package — though their texture image files must be packaged alongside for a fully rendered result.
OBJ File Structure
An OBJ file is ASCII text. Lines beginning with specific keywords define geometry elements:
# Comment line
mtllib model.mtl # Reference to companion material file
v 1.0 0.0 0.0 # Vertex (x y z)
v 0.0 1.0 0.0
v 0.0 0.0 1.0
v 0.0 0.0 0.0
vt 0.5 0.5 # Texture coordinate (u v)
vt 0.0 1.0
vn 0.0 1.0 0.0 # Vertex normal (nx ny nz)
usemtl Material1 # Activate material from MTL file
o MyObject # Object name
g group1 # Group name
f 1/1/1 2/2/1 3/1/1 # Face (vertex/texcoord/normal indices)
f 1 2 3 # Face with only vertex indices
Key OBJ Keywords
| Keyword | Meaning |
|---|---|
v |
Geometric vertex (x, y, z, optional w) |
vt |
Texture coordinate (u, v, optional w) |
vn |
Vertex normal (must be unit vector) |
vp |
Parameter space vertex (curves/surfaces) |
f |
Polygonal face (index triplets) |
l |
Line element |
o |
Object name |
g |
Group name |
s |
Smooth shading group |
usemtl |
Activate named material |
mtllib |
Reference MTL file |
The MTL Companion File
Material properties in MTL use a parallel keyword system:
newmtl Material1 # Define material named Material1
Ka 0.1 0.1 0.1 # Ambient color (RGB)
Kd 0.8 0.5 0.2 # Diffuse color (RGB)
Ks 1.0 1.0 1.0 # Specular color (RGB)
Ns 96.0 # Specular exponent (shininess)
d 1.0 # Dissolve (opacity, 1=opaque)
Tr 0.0 # Transparency (inverse of d)
illum 2 # Illumination model (0-10)
map_Kd texture.png # Diffuse texture map
map_Ks specular.png # Specular map
map_bump normal.png # Bump/normal map
map_d alpha.png # Alpha map
Illumination Models
The MTL illum value selects a lighting model:
| Value | Model |
|---|---|
| 0 | Color on, ambient off |
| 1 | Color and ambient on |
| 2 | Highlight on |
| 3 | Reflection on, ray trace on |
| 4 | Transparency: glass on, ray trace on |
| 5 | Reflection: Fresnel on, ray trace on |
| 6-10 | Various ray-tracing and Fresnel combinations |
Strengths and Limitations
What OBJ Does Well
- Universal compatibility — supported by Blender, Maya, 3ds Max, Cinema 4D, ZBrush, Substance Painter, Unity, Unreal Engine, and virtually every 3D tool
- Human-readable — plain ASCII text is easy to inspect, debug, and script
- Lightweight specification — simple to implement in custom tools and exporters
- No proprietary lock-in — fully open standard
- Excellent for static meshes — geometry and materials transfer cleanly
OBJ Limitations
- No animation — OBJ stores only static geometry; skeletal animation, morph targets, and keyframes are not supported
- No rigging — bone weights and armature data cannot be stored
- No scene hierarchy — limited grouping with
oandgkeywords, no parent-child relationships - No PBR materials — the MTL spec predates physically-based rendering; PBR properties (roughness, metalness, emission) require extensions or separate workflows
- Large file sizes — verbose ASCII text; a 1M polygon mesh generates very large files compared to binary formats
- Texture paths are relative and fragile — MTL references textures by relative path, so moving files breaks the link
- No embedded textures — images must be separate files alongside the OBJ/MTL
OBJ vs. Modern Alternatives
| Feature | OBJ | glTF 2.0 | FBX | USD |
|---|---|---|---|---|
| Animation | ❌ | ✅ | ✅ | ✅ |
| PBR materials | ❌ | ✅ | Partial | ✅ |
| Binary option | ❌ | ✅ (GLB) | ✅ | ✅ (USDC) |
| Embedded textures | ❌ | ✅ (GLB) | ✅ | ✅ |
| Scene hierarchy | Limited | ✅ | ✅ | ✅ |
| Compatibility | Universal | Growing | Very wide | Growing |
| File size | Large | Compact | Medium | Varies |
When to still use OBJ: static mesh exchange between any two 3D tools, simple geometry for 3D printing preparation, legacy pipeline compatibility, and situations where human-readable format is required.
When to prefer glTF: web delivery (Three.js, Babylon.js), game engines for runtime assets, any workflow requiring PBR materials or animation.
Working With OBJ Files
Importing OBJ into Major Tools
- Blender: File → Import → Wavefront (.obj). Blender 3.0+ uses a rewritten fast importer
- Maya: File → Import (OBJ is natively supported or via Bonus Tools)
- Cinema 4D: File → Open or Merge; OBJ imports with material assignments
- Unity: Drag OBJ into Assets panel; Unity reads companion MTL automatically
- Unreal Engine: Import via Content Browser; materials created from MTL data
Exporting OBJ: Common Settings
- Scale factor — unit mismatches (cm vs. m) cause 100× size differences; always verify scale on import
- Axis orientation — OBJ uses Y-up by default; Blender uses Z-up internally and converts on export
- Triangulate — some apps cannot import quads or n-gons; triangulating before export avoids issues
- Include normals / UVs — always export normals and texture coordinates for textured models
Optimizing OBJ Files
- Merge duplicate vertices to reduce file size
- Remove unused materials from the MTL file
- Pack textures into a single atlas to reduce draw calls
- Use GLB/glTF conversion for web delivery (significantly smaller files)
OBJ in 3D Printing
OBJ is widely used as a 3D printing format because slicers like PrusaSlicer, Cura, and Chitubox all support it. Advantages over STL: OBJ supports vertex colors, which some slicers use for multi-material printing color mapping.
For single-material prints, STL remains more common because it is simpler and smaller. For full-color prints (Bambu Lab, Stratasys J-series), OBJ with color information is often preferred.
Converting OBJ Files
OBJ → glTF/GLB: Use Blender's built-in glTF exporter, or online converters. GLB packages geometry + textures + materials in one binary file, dramatically reducing size.
OBJ → FBX: Blender (import OBJ → export FBX) or Autodesk FBX Converter. Necessary when transferring to game engines that prefer FBX for skinned meshes.
OBJ → STL: For 3D printing; Blender, Meshmixer, or online converters. Strips materials; keep only geometry.
OBJ → USD: For VFX pipelines (Maya, Houdini, Pixar's usdview). USD preserves scene hierarchy and material networks that OBJ cannot represent.
Related conversions
Frequent conversions across the catalogue: