3MF to glTF

Your model never leaves your browser, and nothing is downloaded to make this work. A mesh is a list of points and a list of triangles; reading one and writing the other is arithmetic your browser can already do.

…or drop one anywhere on this page.

Into readable JSON, self-contained: the numbers are written into the document itself rather than into .bin files beside it, because a download is one file. That costs about a third in size against a GLB, which is exactly why GLB exists.

3MF is what 3D printing moved to, and the reason is that it records what its numbers mean. It is also a build plate rather than a model: several objects, each placed by its own transform, which are all put where the file says.

This conversion loses the units, and that matters

3MF is the only format on this site that records what its numbers mean: <model unit="millimeter">, or inches, or microns. glTF cannot hold that. It is not converted and not approximated — there is nowhere to put it.

So what your file says is shown above, and it is worth writing down, because whatever opens the result next will have to guess. Guessing wrong is why models arrive at twenty-five times their intended size, or a twenty-fifth. Nothing is rescaled here: the numbers come across exactly as they were written, and silently multiplying your model by 25.4 would be far worse than telling you.

A 3MF is a build plate, not a model

The <build> section lists items, each naming an object and carrying a transform of twelve numbers. Objects can also be assembled out of other objects, nesting, each with its own transform. That is what makes a 3MF a plate with things arranged on it rather than a single shape.

A reader that takes the first object and ignores the build gets the right triangles in the wrong places — every part at the origin, interpenetrating — with the triangle and vertex counts perfectly correct. The transform is twelve numbers in row-major order with the translation last, which is not how glTF stores the same idea; read the other way round, a moved part goes somewhere else entirely.

Both of these store a corner once

Both formats keep a list of points and refer to them by number, so a corner where six triangles meet is stored once and pointed at six times. That is what an STL cannot do, and it is why these conversions do not change the size of a file very much.

Duplicate corners are still welded on the way through, in case the model passed through an STL earlier in its life — but only bit-for-bit identical ones. Welding within a tolerance, which most tools do, quietly fuses surfaces somebody meant to keep apart. The number actually welded is reported above.

What does not come across

Materials, textures, animation and the scene. The result is one mesh in one node with no material, and a viewer will show it in its default grey. The numbers are written into the document as base64 rather than into .bin files beside it, which makes it one file you can actually keep — at about a third more size than the same model as a GLB.

Whether it is watertight is reported above, because that is what a slicer is about to ask: a closed solid has every edge shared by exactly two triangles, and one that does not leaves the slicer guessing what is inside. This is measured after welding — straight off an STL no two triangles share a corner by index, so every model on earth would look full of holes. Nothing here repairs a mesh; it tells you, and repairing is a different job.

Nothing is rotated. glTF is Y-up by its specification, COLLADA records an up axis of its own, and STL, OBJ and PLY say nothing at all — in practice arriving Z-up from CAD tools. What a file declares is reported rather than acted on, because a silent rotation is far worse than a model you can turn yourself. If your object arrives lying on its side, that is why, and it is one rotation in whatever opens it next.

Where to go next