Skip to main content

How to Reduce 3D File Size: GLB, STL, OBJ, and PLY Optimization

Updated Mar 2026

Your 3D file is too big. Maybe your web page takes 8 seconds to load because of a 45 MB GLB. Maybe your slicer freezes on a 5-million-face STL. Maybe you cannot email a 200 MB PLY to your client. The fix depends entirely on your format and what you are trying to do — compressing a GLB for a website is a completely different operation from simplifying an STL for 3D printing, and using the wrong technique either does nothing or destroys quality. This guide covers all four major mesh formats with real compression measurements, so you know exactly what to expect before you start.

Tools used in this guide

Step-by-Step Guide

  1. 1

    First: compression vs simplification (they are NOT the same thing)

    This distinction trips up a lot of people. Compression encodes the same geometry more efficiently — same shape, fewer bytes. Like zipping a file. Draco compression on a GLB is compression. Simplification removes polygons — the output is a geometrically different (though visually similar) mesh with fewer triangles. Reducing a 2M-face STL to 200K faces is simplification. For web and AR: you want compression (Draco). For 3D printing: you want simplification (polygon reduction). For Gaussian Splatting: you want format conversion (PLY to SPZ). Using the wrong technique is the #1 mistake — people try to "compress" an STL for printing (does nothing useful) or "simplify" a GLB for web (destroys detail unnecessarily when Draco would have been lossless).

  2. 2

    GLB files: Draco compression (web and AR)

    Open /compress/draco and upload your GLB. Draco encodes vertex positions, normals, and UV coordinates using quantization and entropy coding — lossy in theory, but perceptually invisible at default settings. Real numbers from files we have processed: a 26 MB product model → 560 KB (97.8% reduction). A 4.2 MB architectural model → 890 KB (78.8% reduction). A 52 MB photogrammetry scan → 1.8 MB (96.5% reduction). The output is a standard GLB that Three.js, Babylon.js, and Google Model Viewer all decode automatically via the Draco WASM decoder. Critical caveat that catches people: Draco only compresses mesh geometry. If your GLB is 30 MB because of embedded 4K textures, Draco will shrink the mesh portion but barely touch the total file size. You need to reduce texture resolution separately — downsampling from 4K to 2K cuts texture size by 75% with negligible visual difference on a web page.

  3. 3

    STL files: polygon simplification (3D printing)

    A photogrammetry scan at 5 million faces is absurd for FDM printing. Your printer at 0.2mm layer height physically cannot reproduce details smaller than 0.2mm — those extra millions of polygons are invisible in the final print and just make your slicer slow. Open /simplify/stl and reduce the face count. The tool uses Quadric Error Metrics (QEM) — the same algorithm Blender and MeshLab use internally. Safe targets: FDM at 0.2mm layers → 200K-500K faces is plenty. Resin printing → up to 1M faces. Large format FDM → 100K-300K faces. Real example: a photogrammetry scan at 2.1M faces (85 MB) simplified to 200K faces (8 MB) — the FDM print was visually identical. Slicing time dropped from 6 minutes to 35 seconds.

  4. 4

    OBJ files: convert first, then compress

    Here is the thing about OBJ optimization: it is usually the wrong approach. OBJ is a text-based format — inherently larger than binary formats for the same geometry. The OBJ Optimizer at /optimize/obj removes duplicate vertices and strips unused material references, but the gains are modest (typically 10-25% reduction). If your OBJ is headed for the web, skip OBJ optimization entirely. Convert to GLB at /convert/obj-to-glb, then Draco-compress the GLB. The format switch alone (text → binary) cuts size by 40-60%, and Draco adds another 70-95% on top. The OBJ optimizer is only worth using when you absolutely must stay in OBJ format — for example, feeding into a tool that only accepts OBJ input.

  5. 5

    PLY files: two completely different situations

    PLY is tricky because the same file extension means two totally different things. Mesh PLY (triangle geometry from 3D scanning or modeling): use /simplify/ply — same QEM algorithm as the STL simplifier, same polygon reduction logic. Gaussian Splatting PLY (3DGS captures from Polycam, Luma AI, Nerfstudio): use /splat-compress/ply — this converts to SPZ format using gaussian quantization, typically reducing a 150 MB splat PLY to 8-15 MB (90%+ reduction). Do NOT apply mesh simplification to a Gaussian Splatting PLY. The file structures are completely different — mesh simplification on a 3DGS file will corrupt it. How to tell which you have: open the file header in a text editor. Mesh PLY has properties like vertex_indices or face. 3DGS PLY has properties like f_dc_0, opacity, rot_0, scale_0.

  6. 6

    Always verify after reduction

    This takes 30 seconds and saves you from deploying a broken model or wasting filament on a bad print. Upload the reduced file to the appropriate viewer: /viewer/glb, /viewer/stl, /viewer/obj, or /viewer/ply. For 3D printing: confirm the face count is in range (shown in the viewer stats) and that bounding box dimensions are unchanged — simplification should not alter the model's size. For web: compare the file size before and after. A 50% size reduction roughly equals 50% faster load time, since 3D model loading is almost always network-bound. Rotate the model and look for artifacts: holes, inverted faces (dark patches), or missing geometry at thin features. If you see problems, reduce the simplification aggressiveness and try again.

Frequently Asked Questions

Simplification vs compression — which do I need?
Quick rule: if you are reducing file size for the web or AR, use compression (Draco for GLB). If you are reducing for 3D printing or to speed up a slicer, use simplification (polygon reduction). If you are reducing a Gaussian Splatting file, use format conversion (PLY to SPZ). Compression preserves exact geometry in fewer bytes. Simplification changes the geometry to use fewer polygons. They solve different problems.
How much will Draco actually reduce my GLB?
Depends on the model. Detailed models with many unique vertex positions (characters, product models, architecture): 70-97% reduction of mesh geometry. Simple models with regular geometry (basic shapes, walls, floors): 40-70% reduction. But Draco does not touch textures — if your GLB is large because of embedded 4K texture maps (common with photogrammetry), Draco alone will not help much. Reduce texture resolution to 2K before converting.
Will simplifying my STL ruin the print?
Not at reasonable levels. FDM printers at 0.2mm layers cannot resolve details below ~0.2mm, so a 2M-face model and a 200K-face model produce identical prints. The risk is over-simplification: if you go too aggressive, sharp edges round off and fine surface details disappear. Safe approach: simplify in stages (50% reduction at a time), check the viewer after each pass, stop when you see the first signs of quality loss, then back up one step.
My OBJ is huge because of textures — what should I do?
OBJ textures are PNG or JPEG files referenced by the .mtl file. Three fixes: (1) Use JPEG instead of PNG for photographic textures — 5-10x smaller. (2) Reduce texture resolution — 4K to 2K cuts size by 75% with no visible difference on most screens. (3) Remove unused texture maps (specular, bump maps you do not need). Then convert the whole package to GLB (upload as ZIP to /convert/obj-to-glb) and Draco-compress the result. This typically achieves 90%+ total reduction.
Is there a file size limit?
Mesh tools accept up to 150 MB on desktop, 25 MB on mobile. The 3DGS compressor accepts PLY up to 200 MB and other 3DGS formats up to 100 MB. All processing is local via WebAssembly — no server upload limit or API quota. For very large files (approaching limits), processing may take 10-30 seconds on older hardware, but the result is always computed locally.

Related Tools

Related Format Guides