OBJ Viewer: Open OBJ Files in Your Browser

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 v lines that define every point in space.
  • Normals — the vn lines that tell a renderer which way each surface faces.
  • Texture coordinates — the vt lines that map a 2D image onto the 3D surface.
  • Faces — the f lines 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.

  1. No .mtl was included. The OBJ refers to a material library that was not copied alongside it, so the receiver has nothing to apply.
  2. The .mtl exists but the texture paths are broken. MTL files store absolute or relative paths. Move the folder and every texture reference fails at once.
  3. 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.
  4. 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.
  5. 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.

  1. Open the OBJ viewer. It reads the single .obj you select with JavaScript, so the file never leaves your machine.
  2. Choose the OBJ file. A preview appears on a dark stage once the mesh is parsed.
  3. 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.
  4. Inspect geometry, not appearance. Because the .mtl is not loaded, expect a default material. Judge silhouette, topology and holes rather than colour.
  5. 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_L survives the round trip; Object7 does 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

SymptomLikely causeWhat to do
Model is flat greyMTL not loaded or not presentExpected in a single-file viewer; check materials elsewhere
Nothing rendersFile is empty, truncated or not really an OBJRe-export and confirm the extension matches the content
Model is inside-outInverted normalsRecalculate normals in the source tool and re-export
Model is tiny or hugeNo unit in the formatCompare against a known reference and rescale
Loads slowlyVery dense meshDecimate in the source tool, then reopen
Parts are missingUnmerged or hidden objects excluded at exportRe-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.

OBJ Viewer: Open OBJ Files in Your Browser | Hunyuan Motion