STL to 3MF

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 the modern printing format — which, unlike every other format here, records what its numbers mean.

An STL is triangles and nothing else, and it writes every corner out once per triangle rather than saying that two triangles share one. Coming out of it, those duplicates are welded back together, which is usually a large drop in file size and is what turns a soup of unconnected faces into something a modeller can work with.

3MF records units, and your file does not

3MF is the only format on this site that stores what its numbers mean, which is most of the reason 3D printing moved to it. But STL does not record units at all, so there is nothing to carry across and nothing that can be deduced from the numbers themselves. A cube ten units wide is ten millimetres or ten inches and the file does not say which.

Millimetres are written, because that is the format's own default and what almost everything means. That is an assumption, not a reading. Getting it wrong is what makes a model come out twenty-five times its intended size, or a twenty-fifth of it: if your object was drawn in inches and something reads it as millimetres, it prints far too small, and the other way round it prints far too large. The choice above sets what goes into the file, so set it to what your numbers actually mean.

Telling a binary STL from a text one

An STL comes in two spellings: a text one beginning with the word solid, and a binary one beginning with an eighty-byte header its writer may put anything in. A great many writers put the word solid in it.

So a reader that sniffs the first five characters calls a large minority of the world's binary STLs text files, finds no triangles in them, and reports a perfectly good model as empty or damaged. The reliable test is arithmetic and it is what is used here: a binary STL is exactly 84 + 50 × the count in its header bytes long, and nothing else is. That is checked before the word is looked at.

Welding the corners back together

An STL has no way to say that two triangles share a corner, so each carries its own three points and a corner where six triangles meet appears six times. Every other format here stores each corner once and points at it, so coming across, those duplicates are joined back up. That is usually a large drop in file size, and it is what turns a soup of unconnected faces into a model a modeller can work with.

Only bit-for-bit identical corners are joined. Most tools weld within a tolerance — anything closer together than a thousandth of a millimetre becomes one point — and that quietly fuses surfaces somebody meant to keep apart: two parts of an assembly touching at a face become one solid, and nobody finds out until it prints wrong. Exact welding cannot do that. It also cannot join two corners that floating-point rounding put a millionth apart, so the number actually welded is reported above rather than assumed.

What does not come across

Colours, print settings and the arrangement of the plate. What is written is one object with its geometry and its unit. Supports, infill, per-object settings and the rest of what a slicer puts in a 3MF are not here, because they were not in the file you started with.

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