Skip to the tool
CALCPARK

3MF to STL Converter

Open a 3MF file in your browser, rotate it in a 3D preview, see objects, triangle counts and dimensions, and download a binary STL – nothing is uploaded.

Files stay on your device
Loading the tool…

How to use it

  1. Drop a .3mf file on the page or choose it. It is unpacked in a background thread of this tab – nothing is uploaded.
  2. Check the object list: name, triangle count and the width × depth × height of each build item in millimetres, plus the bounding box of the whole build.
  3. Rotate the 3D preview by dragging, zoom with the scroll wheel or a pinch, press 0 to reset the view.
  4. Pick the export unit (millimetres, or the model’s own unit if your slicer expects it) and, for builds with several objects, one merged STL or one STL per object in a ZIP.
  5. Click “Build STL file”, then download. The file name is taken from the 3MF.

Example

A 3MF written in centimetres contains one 1 × 1 × 1 cube mesh (8 vertices, 12 triangles). A second object places that cube twice through components – once at the origin and once moved by 2 cm in x – and the build item shifts the pair by another 0.5 cm. The converter resolves the components and transforms, converts to millimetres and reports 24 triangles in a bounding box of 30 × 10 × 10 mm (x from 5 mm to 35 mm). The binary STL is 84 + 24 × 50 = 1,284 bytes.

How the conversion works

The package is read with size caps enforced before anything is inflated (100 MB file, 200 MB per part, 256 MB in total), so a malformed or “zip bomb” file is refused early. The root model part is located through _rels/.rels, falling back to 3D/3dmodel.model. Each build item is resolved recursively: a mesh object contributes its triangles, a components object contributes its children with their transforms composed on top of the parent’s. 3MF transforms are 4 × 3 matrices written row-major, applied to row vectors:

transform = m00 m01 m02  m10 m11 m12  m20 m21 m22  m30 m31 m32
x' = x·m00 + y·m10 + z·m20 + m30
y' = x·m01 + y·m11 + z·m21 + m31
z' = x·m02 + y·m12 + z·m22 + m32
mm = unit × { micron 0.001, millimeter 1, centimeter 10, inch 25.4, foot 304.8, meter 1000 }

A mirrored transform (negative determinant) flips the triangle winding so the exported normals keep pointing outwards. Each STL facet gets the unit normal of its triangle, the three vertices as 32-bit floats and a zero attribute word. Objects of type support, surface or other and empty meshes are listed as skipped instead of being exported silently. The preview is a small WebGL renderer with flat shading; above 1.5 million triangles it is skipped to keep the page responsive while the export still includes everything.

Sources: 3MF Consortium – Core specification, 3MF Consortium – Production extension, Library of Congress – STL (binary) format description.

Questions

Why is my exported model 10 or 25.4 times bigger or smaller than expected?
STL has no unit. If the 3MF was saved in centimetres or inches, the default export converts to millimetres (× 10 or × 25.4). Choose "Model unit" if your slicer is set to interpret the file in that unit instead.
Will colours, multi-material assignments or my print profile survive?
No. STL stores only triangles. Colours, painted regions, materials, names and slicer settings exist only in the 3MF. Keep the original 3MF if you need them.
The converter says the file needs an unsupported extension. What now?
Beam lattices, slice stacks, encrypted (secure content), boolean, displacement and volumetric objects cannot be represented as a plain mesh here, so the file is rejected rather than exported with parts missing. Export the model from the authoring software as a mesh first.
Can I open a 3MF from Bambu Studio or PrusaSlicer?
Yes – both store objects in separate parts via the Production extension, which is supported. Modifiers, supports and plate settings are not geometry and are skipped or listed as not exported.