Convert 3MF to PLY

Converting 3MF to PLY hands a print package to the tools that measure meshes rather than slice them. It is the only PLY source here whose coordinates arrive in a known unit, because a 3MF declares its own — which is what turns a volume reported by MeshLab from a number into a measurement.

  • Where it runs In your browser. The file is never uploaded.
  • Rebuilt PLY works differently from a 3MF, so this is not the gradual degradation a lossy codec applies. What PLY can express is reproduced faithfully; what it has no equivalent for does not survive at all.
  • File size limit Up to 100 MB per file, free, without an account.
  • Worth knowing Geometry only. Materials, colours, textures and animation are not carried across, and a model placed several times comes back with each copy baked into its own position.

Up to 100 files at once. Mixed formats are fine.

Measuring a print file instead of printing it

There is a distinct job that is not printing and not modelling: finding out whether a part is what it is supposed to be. Is the wall actually 1.6 mm where the drawing says so. What volume of material will this consume. Does the supplier’s file match the geometry that was signed off. How far has a printed part drifted from the model, once you have scanned it back.

None of that happens in a slicer, and it happens naturally in MeshLab, CloudCompare, Open3D and trimesh — all of which treat PLY as the format that needs no explanation. So the conversion is a step in a measurement rather than a delivery, and the questions worth answering here are about fidelity of numbers rather than about appearance.

The only PLY on this site that arrives with a unit

PLY records no unit. Neither does STL, OBJ or glTF. A scan from one device is in millimetres, from another in metres, and a mesh from a modelling package is in whatever the artist was thinking in — so a volume computed on a typical PLY is a number whose unit you have to establish separately.

A 3MF is the exception, because the format requires the model element to declare one: micron, millimetre, centimetre, inch, foot or metre. The reader resolves it, multiplying by 25.4 for inches and by 1000 for metres, so the PLY that comes out is in millimetres whatever the source said. MeshLab’s reported volume is then cubic millimetres and its measured distances are millimetres, without a conversion factor written on a sticky note.

Vertex counts cross from the 3MF unchanged

Some sources on this site are welded on the way in, because an STL stores three unshared vertices per triangle and would otherwise produce absurd files. A 3MF stores an indexed vertex list already, so nothing is welded and nothing is renumbered within an object — the positions and the triangle indices come across as the file had them.

That is exactly the property a comparison needs. If the source reports 48,212 vertices, the PLY header says 48,212, and a difference is a real difference rather than an artefact of the conversion. It also means any duplicate vertices the authoring tool left in place are still there, which is worth knowing before running an algorithm that assumes a clean manifold — merge with an explicit tolerance in your tool rather than assuming it has been done.

Build placements are baked, so the PLY describes the plate

A 3MF separates what an object is from where it goes: the resources section holds the meshes, and the build section places each one with a transform. The reader applies those transforms to the vertices, because PLY has no way to express a placement.

The consequence is a measurement trap worth naming. The coordinates in the PLY are plate coordinates, not part coordinates, so a part arranged at the back left of a 256 mm bed sits nowhere near the origin and its bounding box is correct while its position is meaningless as a description of the part. For volume, area and thickness that does not matter. For registration against a scan, or for comparing two exports of the same part, translate each mesh to its own centroid first — `mesh.apply_translation(-mesh.centroid)` in trimesh — or the alignment step starts from a hundred-millimetre offset it has to discover.

Every object on the plate merges into one PLY surface

PLY holds a single vertex list and a single face list. A 3MF holding three named objects, or one object placed five times, therefore produces one surface with the vertex lists concatenated and the face indices offset accordingly.

The geometry is intact and the identity is gone: no names, no object boundaries, no per-object metadata. Connected-component analysis recovers the pieces — MeshLab’s Split in Connected Components and `trimesh.Mesh.split()` both do it — but a volume computed on the merged file is the total across everything on the plate, which is the wrong answer to "how much material is this part". Convert one object at a time if the numbers are per-part, by deleting the others in a slicer and re-saving.

Component assemblies arrive whole, with their transforms applied

A 3MF object may be defined as an assembly — a list of `<components>` referencing other objects, each with its own transform — rather than as a mesh. The reader resolves those references recursively and multiplies each transform into the one above it, so a part nested two levels down lands where the file says it goes rather than at the origin.

That was not always the case, and the failure it replaced is worth naming because it was silent. Walking mesh elements only meant the build item named an object with no geometry of its own, the model came out empty, and the fallback then emitted the part objects at the origin with every placement lost — a two-part assembly arriving as two overlapping parts. Today a file that yields no triangles anywhere raises "No triangle geometry was found in this 3MF" instead, and a component chain that references itself is cut rather than followed into a stack overflow.

The PLY is text, and a dense 3MF makes a very large one

The header always reads `format ascii 1.0`. There is no binary option, so every coordinate is written as decimal digits and every face as a line beginning with 3. Format summaries — including this site’s — describe PLY as a binary format, and that is true of the specification and not of what comes out of here.

The size difference is substantial: a packed float32 coordinate is four bytes and its written form is ten to fifteen characters. A 3MF is compressed XML, so a package of a few megabytes routinely expands into a PLY several times larger. Everything reads the result and `head -20` shows you the header, which is a fair trade for a file you are about to load into an analysis tool anyway. If you need it packed, MeshLab and trimesh both write binary PLY on re-save.

What the print package holds that the PLY does not

Colour groups, base materials, per-triangle property assignments, object names, print settings, support enforcers, modifier meshes, the printer profile, the plate definition, the thumbnail and every scrap of slicer metadata. None of it is read, and the PLY declares only x, y and z properties with no colour, normals or texture coordinates.

For measurement that is mostly irrelevant — you are asking about geometry — with one exception worth flagging. If the part is multi-material, the boundary between materials is expressed as triangle property assignments, and after conversion there is no way to tell one region from another. Measuring the volume of the flexible section alone is a question this file cannot answer.

What MeshLab and CloudCompare can tell you about the converted part

MeshLab’s Compute Geometric Measures gives surface area, volume, the bounding box and the centre of mass in one pass, and its topological measures report the number of connected components, boundary edges and non-manifold edges — which together answer both "how much material" and "is this actually a solid". Its Distance from Reference Mesh compares two meshes vertex by vertex and produces a coloured error map.

CloudCompare is the better tool when one side is a scan: its cloud-to-mesh distance takes the scanned points and the converted PLY and reports signed distances with a histogram, which is the standard way to show that a printed part is 0.3 mm undersize across one face. Both of those numbers are in millimetres, because the 3MF said so, and that is the whole reason this conversion is worth doing rather than exporting an STL.

Where the 3MF package is unpacked

In this browser tab. The archive is decompressed and the model XML parsed by JavaScript running in the page, with no WebAssembly module to fetch, no upload, no account and no daily allowance. The network tab during a conversion is how to confirm it.

Print files are frequently somebody else’s intellectual property — a customer’s part, a supplier’s geometry, a component under a non-disclosure agreement — and the quality-assurance job on this page is exactly the situation where that is true. A conversion that never sends the file is the only version of this workflow that does not need a conversation with somebody about it.

How to turn a 3MF print file into a PLY for analysis

  1. Delete the other objects in a slicer first if the numbers have to be per part rather than per plate.
  2. Drop the .3mf here; it is unzipped, scaled to millimetres and merged in your browser.
  3. Open the .ply in MeshLab, CloudCompare or trimesh and measure against the source.

3MF and PLY: a manufacturing package against an analysis mesh

3MF compared with PLY
3MFPLY
Full name3D Manufacturing FormatPolygon File Format
File extension.3mf.ply
Media typemodel/3mfmodel/ply
First published20151994
Published by3MF ConsortiumStanford University
Specification3MF Core Specification
LicensingOpen standardOpen standard
Standing todayCurrentCurrent
Opens in a browserNo browserNo browser
Considered insteadSTL, OBJOBJ, STL

Opening the result

The usual programs do not overlap: 3MF opens in PrusaSlicer, Cura and Microsoft 3D Builder, PLY in MeshLab, Blender and CloudCompare — so whoever receives the result needs something from the second list.

What each format is for

The two are aimed at different work: 3MF at 3D printing, PLY at scanning and moving data between programs. That is worth weighing before converting, because the reason one exists is usually the reason the other is awkward.

3MF is 3MF Consortium's format, published in 2015. The specification is 3MF Core Specification, and it is worth reading if the file has to outlive the tool that wrote it.

PLY comes from Stanford University and dates from 1994. MeshLab, Blender and CloudCompare all read it.

PLY was published in 1994 and 3MF in 2015. The older one is generally the safer file to hand to somebody; the newer one usually does the job in fewer bytes.

3MF to PLY: units, counts and empty results

Are my 3MF files uploaded anywhere?

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.

Are the PLY coordinates in millimetres?

Yes. A 3MF declares its unit and the reader scales to millimetres, so a part authored in inches arrives multiplied by 25.4. That makes this the one PLY source here whose measurements have a unit you can trust without checking.

Is the PLY binary?

No. It is written as format ascii 1.0 with no option to change it, so coordinates are decimal text. Every tool reads it and the file is several times the size of the binary equivalent.

Do the vertex counts match the source?

Yes. A 3MF stores an indexed vertex list and nothing is welded or re-indexed on this path, so the count in the PLY header is the count the file held. That is what makes a before-and-after comparison meaningful.

Why is my part sitting a long way from the origin?

Because the build placement is baked into the vertices. A 3MF positions each object on a plate with a transform, and the PLY holds the result, so the coordinates describe where the part sat rather than the part in its own frame.

Does an assembly of component references convert?

Yes. An object whose body is a list of components rather than a mesh is resolved recursively, with each transform multiplied down the chain, so the parts arrive placed. A 3MF holding no triangles anywhere fails with a message rather than writing an empty PLY.

Does the colour come across?

No. PLY is the natural home for per-vertex colour and this writer emits x, y and z only, so a 3MF carrying colour groups or per-triangle materials produces a plain geometric mesh.

More about these formats