Cookies for analytics and advertising
We use cookies for analytics and advertising, both sent to Google. Refusing changes nothing you can see.Read the privacy page
Converting GLB to OBJ takes a model built for the web and puts it in the format every modelling and CAD package has read since 1992. The geometry and the part names come across intact. Materials, textures, UV coordinates and normals do not, and no accompanying MTL file is produced, so plan on re-applying materials at the far end.
Up to 100 files at once. Mixed formats are fine.
They convert one after another and download together as a ZIP.
GLB to OBJ
glTF and its binary form are eight and nine years younger than most of the software that engineers and artists actually have installed. Wavefront published OBJ in 1992 and it is still the lowest common denominator: Blender, MeshLab and Maya read it, and so does nearly every CAD importer, mesh repair tool, slicer and academic utility written since. A GLB arriving from a web pipeline into that world has to become an OBJ to be opened at all.
The conversion is worth understanding as a downgrade in kind rather than a downgrade in quality. A GLB is a scene: a node hierarchy, materials, textures, animation, cameras. An OBJ is a list of points and the triangles between them, plus a pointer to a separate material file. Everything that is not geometry has to find somewhere else to live, and in this conversion it does not.
Three kinds of line and nothing else. A comment line naming the writer, one o line per mesh carrying the name from the GLB, a v line per vertex with three decimal coordinates, and an f line per triangle with three indices. No vt lines, no vn lines, no s smoothing groups, no usemtl, no mtllib.
The index convention is the part that trips people writing their own parsers: OBJ indices start at one, not zero, and they count across the entire file rather than restarting at each group. The converter tracks that offset as it walks the meshes, so a second object referencing its own first vertex is written with the running total added. Getting this wrong produces an OBJ that opens and shows the wrong triangles, which is worse than one that fails.
An OBJ never held materials itself. It holds an mtllib line naming a companion .mtl file, and that file holds the colours, the shininess and the texture map paths. This converter writes no mtllib line and produces no .mtl, so the OBJ is materially blank and your importer assigns its default grey.
That is a consequence of reading geometry only. The GLB's metallic-roughness parameters, its base colour and normal textures and its UV coordinates are never extracted, so there is nothing to write into an MTL that would not be invented. Inventing it would be worse: an MTL with plausible-looking defaults tells a downstream artist the material came from the source when it did not.
Each glTF mesh name is written as the OBJ o line for that group, so a model assembled from named components — housing, bracket, cover — imports into Blender or Maya as three named objects rather than one merged shape. A mesh with no name in the source gets a generated one so the group structure is still legible.
This matters more than it sounds. In a geometry-only conversion the names are almost the only semantic information that survives, and they are what lets somebody at the far end reassign materials to the right parts. If your GLB has unnamed meshes and you are going to need the distinction, name them before exporting rather than after importing.
glTF can place one mesh many times by referencing it from several nodes with different matrices. OBJ has no equivalent. The converter resolves the difference by walking the scene, composing each node matrix with its parent, and baking the resulting world transform into the vertex coordinates before writing them.
So a GLB with one screw mesh instanced sixty times produces an OBJ with sixty groups and sixty full copies of the screw geometry. The model looks correct — this is the only way to keep it correct — and the file is sixty times larger than the instanced source in that region. If your destination software can instance, rebuilding the instancing there after import is usually worth the effort.
No scaling is applied. Whatever coordinate values the GLB contained are written into the OBJ unchanged, to the precision JavaScript prints them at. That is the correct behaviour and it is also a trap, because the two formats mean different things by a number.
glTF 2.0 defines its linear unit as the metre, so a chair modelled at real size has coordinates around 0.9. OBJ declares no unit at all and every importer applies its own assumption — commonly metres in Blender, commonly centimetres or inches in older CAD tools. Check the bounding box after import against a dimension you know, once, rather than discovering the factor later in a printed part or an assembly.
It passes through as it stands. glTF already stores triangles as indices into a shared position array, so there is nothing to reconstruct: every entry in the accessor becomes one v line in the same order, and every index becomes an f entry pointing at it. Nothing is merged on this path — the merging step that collapses coincident coordinates applies when reading STL and OBJ, where duplicates are the norm, and not here.
That matters when the GLB came out of a real exporter, because glTF holds one UV and one normal per vertex. A vertex sitting on a texture seam or a hard edge has to be split into two or three copies at the same position for the attributes to differ. Those copies survive into the OBJ, where the attributes that justified them do not, so a closed model can report boundary edges along its seams. Merge by Distance in Blender, or Merge Close Vertices in MeshLab, resolves it in one command.
All three import it without configuration. Expect a faceted appearance immediately: with no vn lines in the file, each importer computes flat face normals, and a curved surface tessellated into triangles looks like the polygon shell it is. Shade Smooth in Blender, or an auto-smooth angle around 30 degrees, restores the look the GLB had.
Expect no material. Assigning one is a two-click job in any of the three, and it is worth doing before anything else so that the model is visible against the viewport background. If the model does not appear at all, the usual cause is scale rather than a failed import — zoom to selection and read the dimensions panel.
If the destination reads glTF, do not convert. Blender, three.js, Babylon.js, Unity, Unreal, Windows 3D Viewer and macOS Preview all open a GLB with its materials intact, and putting it through OBJ costs you all of them for nothing.
Convert when the destination genuinely cannot read glTF, or when you specifically want a text file you can inspect, grep or diff. An OBJ is one vertex per line and one face per line, which makes it the easiest of these six formats to check by eye — and that readability, not fidelity, is its remaining advantage over everything newer.
| GLB | OBJ | |
|---|---|---|
| Full name | Binary glTF | Wavefront Object |
| File extension | .glb | .obj |
| Media type | model/gltf-binary | model/obj |
| First published | 2016 | 1992 |
| Published by | Khronos Group | Wavefront Technologies |
| Specification | glTF 2.0 | — |
| Licensing | Open standard | Open standard |
| Standing today | Current | Current |
| Opens in a browser | No browser | No browser |
| Considered instead | GLTF | GLTF, PLY, STL |
Blender reads both GLB and OBJ, so there is a way to check the result against the original without a second tool.
The two are aimed at different work: GLB at the web and handing a finished file over, OBJ at moving data between programs and editing. That is worth weighing before converting, because the reason one exists is usually the reason the other is awkward.
GLB is Khronos Group's format, published in 2016. The specification is glTF 2.0, and it is worth reading if the file has to outlive the tool that wrote it.
OBJ comes from Wavefront Technologies and dates from 1992. Blender, MeshLab and Maya all read it.
OBJ was published in 1992 and GLB in 2016. The older one is generally the safer file to hand to somebody; the newer one usually does the job in fewer bytes.
No. This conversion runs entirely inside your browser, so the file never leaves your device. You can confirm it yourself: open the network tab of your browser's developer tools and convert something. You will see the page load, plus the analytics and advertising the site is paid for with — and nothing carrying your file.
No. No .mtl is written and no mtllib line appears in the OBJ, so the mesh arrives with no material assignment at all and your importer applies its own default. Materials in the GLB are not read in the first place.
Yes. Each mesh becomes its own o group in the OBJ and keeps the name it had in the GLB, so a model built from named parts imports as named objects rather than one merged lump.
Because no vertex normals are written. The OBJ contains v and f lines only, so your software computes flat face normals on import. Applying smooth shading or an auto-smooth angle restores the appearance.
They are dropped. The OBJ has no vt lines and the face entries reference vertex indices only, so any texture you re-apply afterwards has to be re-projected or unwrapped again.
Considerably larger, because OBJ writes every coordinate as decimal text where GLB stores it as four binary bytes. Expect roughly three to five times the size of the GLB geometry, with the textures gone.
The numbers are copied through unchanged. glTF treats its units as metres by convention while OBJ declares no unit at all, so a two-metre model arrives as a model two units tall and your importer decides what that means.