An OBJ viewer is a browser page that loads a .obj file and draws its mesh so you can check it before you hand it off. It is the fastest way to answer the boring but critical questions — is the geometry intact, is the scale sane, is anything obviously broken — without launching a full 3D application. This guide explains what OBJ actually carries, why materials so often look wrong in a viewer, and what to verify before a model goes to an artist.
What OBJ Really Contains
Wavefront OBJ is one of the oldest surviving 3D exchange formats, and its age is both its strength and its limitation. It stores exactly the things a polygon mesh needs and almost nothing else.
- Vertex positions — the
vlines that define every point in space. - Normals — the
vnlines that tell a renderer which way each surface faces. - Texture coordinates — the
vtlines that map a 2D image onto the 3D surface. - Faces — the
flines that join vertices into triangles and polygons. - Object names and groups — light labels that keep separate parts apart.
That is the whole vocabulary. OBJ has no field for a scene graph beyond grouping, no lights, no cameras, no animation, no skinning, and no unit. A model is as big as its numbers say it is and nothing more.
The MTL problem
Materials in OBJ live in a separate .mtl file — a sidecar that lists material names, colours, and the texture image paths each one references. An .obj alone is grey geometry. The material definition is easy to lose because it is a second file with its own paths, and the texture images are a third set of files after that. Three files (or three dozen, with textures) have to travel together, correctly named and correctly referenced, for an OBJ to look the way it did in the tool that exported it.
Why OBJ Materials Often Look Wrong
If you have ever opened an OBJ and found a flat grey blob, you have met the format's most common surprise. Here are the usual causes, in rough order of frequency.
- No
.mtlwas included. The OBJ refers to a material library that was not copied alongside it, so the receiver has nothing to apply. - The
.mtlexists but the texture paths are broken. MTL files store absolute or relative paths. Move the folder and every texture reference fails at once. - The viewer does not load the MTL. Many quick viewers — including the one described here — open the single selected OBJ file and do not resolve a sidecar
.mtl, so surfaces use a default material by design. This is why an OBJ can look correct in Blender and grey in a browser. - Colours were stored as vertex colours, not materials. Vertex colour is not part of the standard OBJ specification, so those colours are simply not carried.
- The material uses a shader the receiver cannot reproduce. Even a correct MTL only describes a basic surface; anything layered on top is application-specific.
None of these mean the file is corrupt. They mean OBJ splits appearance across files, and split files get separated.
Opening an OBJ in the Browser
For a quick geometry check, a local browser viewer is the least friction available. The one below is the same tool as the OBJ viewer page.
- Open the OBJ viewer. It reads the single
.objyou select with JavaScript, so the file never leaves your machine. - Choose the OBJ file. A preview appears on a dark stage once the mesh is parsed.
- Orbit, zoom and pan. Drag to rotate, scroll or pinch to zoom, right-click drag or two-finger drag to pan. Reset camera returns to the default framing; fullscreen gives a bigger stage.
- Inspect geometry, not appearance. Because the
.mtlis not loaded, expect a default material. Judge silhouette, topology and holes rather than colour. - Convert if you need another format. The browser 3D converter can turn an OBJ into glTF, STL or PLY, again without an upload.
Two honest notes about this kind of viewer: it shows the mesh in its stored pose, and it does not play animation (OBJ cannot carry any). It sets no file-size limit of its own, but very dense meshes depend on your device's memory and may load slowly.
Handing a Model to an Artist: A Checklist
Before an OBJ leaves your hands, confirm each of these. The list is short because it targets the failures that actually happen.
- Package all files together. The
.obj, the.mtl, and every referenced texture image in one folder, with paths that still resolve inside that folder. - Use relative, not absolute, texture paths. Absolute paths break the moment the folder moves.
- Triangulate or declare your polygons deliberately. OBJ supports n-gons, but some tools triangulate on import in ways you did not intend.
- Clean the mesh. Merge stray vertices, remove interior faces, and check for non-manifold edges before export.
- State the scale and axis convention in a README or naming. OBJ carries no units and no up-axis, so say what one unit means and which way is up.
- Name objects meaningfully.
Body,Head,Wheel_Lsurvives the round trip;Object7does not. - Verify it opens elsewhere. Load the packaged folder in a second tool or a browser 3D viewer and confirm the geometry reads. If appearance travels with it, check that too.
If the artist only needs geometry, a careful OBJ hand-off is still one of the most portable things you can send. If they need materials or motion, send GLB or FBX instead and use OBJ only for the legacy step that demands it. Our own generator, for example, exports animated FBX motion data for engines rather than OBJ, precisely because animation has nowhere to live in OBJ.
Troubleshooting the Viewer Itself
| Symptom | Likely cause | What to do |
|---|---|---|
| Model is flat grey | MTL not loaded or not present | Expected in a single-file viewer; check materials elsewhere |
| Nothing renders | File is empty, truncated or not really an OBJ | Re-export and confirm the extension matches the content |
| Model is inside-out | Inverted normals | Recalculate normals in the source tool and re-export |
| Model is tiny or huge | No unit in the format | Compare against a known reference and rescale |
| Loads slowly | Very dense mesh | Decimate in the source tool, then reopen |
| Parts are missing | Unmerged or hidden objects excluded at export | Re-export with all objects visible and selected |
FAQ
Is my OBJ file uploaded when I open it in a browser viewer?
No. The viewer reads the file from your device and parses it locally with JavaScript, so nothing is sent to a server. Closing or reloading the page discards the model.
Why does my OBJ look grey in the viewer but fine in Blender?
Because OBJ materials live in a separate .mtl file that a single-file browser viewer does not load. Blender resolves that sidecar and its textures; the viewer applies a default material by design. The geometry is intact — only appearance is missing.
Does OBJ support textures, colours and animation?
Textures and colours are only referenced through a separate .mtl file and its image paths, never stored in the .obj itself. Vertex colours are outside the standard. OBJ has no animation support at all.
What files should I send alongside an OBJ?
Send the .obj, its .mtl, and every texture image the MTL references, all in one folder with relative paths. Without the MTL and images, the receiver sees grey geometry.
Is OBJ or GLB better for sharing a model?
It depends on what must travel. OBJ is the most universally readable geometry-only format. GLB keeps geometry, materials, textures and animation in a single compact file, so it is usually the better choice when appearance or motion matters.
Can I convert an OBJ to another format in the browser?
Yes. The browser converter reads OBJ and writes glTF, STL or PLY. As with the viewer, the conversion happens locally on your device and nothing is uploaded. If the STL is headed for a 3D printer, the STL viewer guide has a two-minute pre-print checklist.