Library / SDK
cnr-isti-vclab/meshlab avatar
cnr-isti-vclab/meshlab

MeshLab: What the Open Source Mesh Processing System Does, and Where It Stops

The open source mesh processing system

5,847 stars920 forksC++GPL-3.0

At a glance

What is it?
MeshLab is a GPL-3.0 desktop application for editing, cleaning and converting large unstructured triangle meshes, built on VCGlib. It is the right tool for scanned geometry, and the wrong one for parametric CAD.
Who is it for?
Adopt MeshLab if your input is scanned or reconstructed geometry: large triangle meshes, point clouds, textured PLY or OBJ files, and you need filters for cleaning, simplification and conversion. Do not adopt it if you need parametric solids, constraint-driven modeling or a scriptable headless pipeline as your primary interface; VCGlib is the library for that, and MeshLab is the interactive front end.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 36 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What MeshLab is for, and who actually needs it

MeshLab describes itself as an open source, portable and extensible system for processing and editing unstructured large 3D triangular meshes. The word doing the work in that sentence is unstructured. Scanned geometry has no feature tree, no constraints and no history. It is a soup of triangles with noise, holes, flipped normals and duplicated vertices, and the tools that model a bracket in a CAD package have nothing to say about it. MeshLab is aimed at exactly that soup: the README says it targets the typical not-so-small unstructured models arising in 3D scanning, with tools for editing, cleaning, healing, inspecting, rendering and converting them.

The audience follows from that. Photogrammetry and structured-light scanning pipelines produce meshes that need decimation before they can be viewed, holes that need filling before they can be printed, and format conversions between PLY, OBJ, STL, OFF, 3DS and COLLADA. Cultural heritage digitisation is a long-standing use case for the Visual Computing Lab at ISTI-CNR, which is where the project comes from. A 3D printing hobbyist who downloaded a broken STL is also in scope. Someone who wants to design a mechanical part is not.

One structural detail matters for anyone planning to work on the code: the repository keeps two branches. The main branch holds the last release version with bugfixes and changes that do not affect the released binary, and is used to publish post-releases. The devel branch holds new features destined for the next release, and bugfixes from main are merged into it automatically. A pull request that changes behaviour belongs on devel; a typo fix belongs on main.

How MeshLab relates to VCGlib, and why that shapes the plugin layout

MeshLab is mostly based on VCGlib, the open source C++ mesh processing library developed at the Visual Computing Lab. The README is explicit about the division of labour: VCG can be used as a stand-alone large-scale automated mesh processing pipeline, while MeshLab makes it easy to experiment with its algorithms interactively. That single sentence explains most of the project's design choices. The algorithms live in the library; the application is a GUI, a filter registry and a set of plugins wrapped around them.

The repository layout reflects this. The src folder holds the source code of MeshLab and its plugins, and has its own README with build details. The docs folder contains doxygen scripts for generating documentation. The resources folder holds files used by the software and by the deploy system to produce the final binary. The scripts folder holds platform-dependent build and deploy scripts, also with their own README. The sample and textures folders contain meshes and images used for tests, which is why the repository ships files like sample/bunny10k.ply, sample/brain.ply, sample/Laurana50k.ply and sample/bunny16k.pts alongside textured examples such as sample/TextureDouble.ply with its two PNG maps.

Then there is unsupported, described as a set of old and unsupported MeshLab plugins that are no longer included and built. If you are looking for a filter you remember from an older version, check whether it moved there before assuming it was removed by accident. The directory is part of the repository, not part of the build.

Installing MeshLab and cleaning a scanned mesh

The README points to the Releases tab for the last MeshLab release for your platform, and states that MeshLab is available for Windows, macOS and Linux. There is also a nightly path: you can test the last nightly version by downloading artifacts of the last GitHub Actions workflow, and the project links a wiki page titled How to install the last nightly version. If you want the source instead, the scripts folder holds automated build and deploy scripts, and src/README.md carries the specific build instructions.

The README gives no package-manager command, so the documented routes are the release binary and the source build. The repository layout shows what a source checkout contains:

bash
ls scripts
ls src
cat src/README.md

The first listing shows the platform-dependent build and deploy scripts, the second shows the source tree for MeshLab and its plugins, and the third prints the build instructions the README defers to. A clean checkout also contains CMakeLists.txt at the top level and a snapcraft.yaml, which is the packaging entry point for the Snap build.

Once MeshLab is open, the workflow for a scanned mesh is filter-driven. Load a file, then apply filters from the menu. A typical clean-up on a file like sample/bunny10k.ply starts by removing duplicated and unreferenced vertices, then recomputing normals, then filling holes, then decimating.

The decimation filter is the one most people arrive for. It is a quadratic edge collapse implementation exposed through the GUI, and the parameter you will actually tune is the target number of faces. The README does not document filter parameters, so treat the dialog itself as the reference and save your settings as a filter script if you need to repeat the run.

One caveat about the release cadence is visible in the release list: MeshLab-2025.07 was published on 2025-07-22, following MeshLab-2023.12 on 2023-12-12 and MeshLab-2022.02 on 2022-03-02. Releases are not frequent, so a feature you see on devel may not reach a binary for a while. The last push to the repository was on 2026-08-25.

Undo, large meshes and the limits of an interactive session

MeshLab's own search traffic contains a telling query: meshlab undo. The application's editing model is filter-based, and filters generally operate destructively on the mesh in memory. That is a different contract from a modeling application with a command stack you can walk backwards. If your workflow assumes unlimited undo of arbitrary operations, you will be disappointed, and the README does not document rollback behaviour. Save intermediate states to separate files instead, which is cheap for small meshes and expensive for large ones.

Memory is the second constraint. The project targets large unstructured meshes, but large is relative to the machine. A decimated 10k-face bunny and a multi-hundred-million-triangle scan are the same file format and very different propositions. Interactive inspection, rendering and filter application all hold the mesh in RAM, and the README gives no memory guidance or benchmark figures. Anyone processing survey-scale scans should test on their own data before building a process around it.

Texture handling is a third area where expectations need calibrating. The sample set includes TextureDouble.ply with two image maps, so multi-texture meshes are supported, but texture atlas work after aggressive decimation is a known source of mismatched UVs in this class of tool. The README does not discuss texture preservation across filters, so verify on a copy.

Finally, MeshLab is a desktop GUI application. If your requirement is a headless batch job in CI, the README's own framing points you at VCGlib as the stand-alone automated pipeline rather than at MeshLab itself.

MeshLab compared with Meshmixer and with VCGlib

The comparison people search for is Meshmixer, and the difference is mostly about intent. Meshmixer was built around interactive sculpting and repair for 3D printing, with a brush-based metaphor and a strong emphasis on making a printable object out of a broken one. MeshLab comes from a research lab and is organised around filters over triangle meshes: measurement, inspection, decimation, remeshing, colour and texture handling, and conversion across many formats. If your job is to make a single model printable, Meshmixer's interaction model is more direct. If your job is to process a batch of survey scans, MeshLab's filter vocabulary is broader and its provenance is documented in the academic references the project asks you to cite.

The more interesting comparison is internal. VCGlib is the same algorithm set as a C++ library you can drive from your own code, and the README presents it as usable for large-scale automated processing. MeshLab is the interactive layer on top. The practical consequence is that a reproducible pipeline belongs in VCGlib, while exploration, visual checking and one-off fixes belong in MeshLab. Teams that try to make the GUI do the work of a pipeline end up clicking through the same filters repeatedly; the project's answer to that is filter scripts, not a CLI.

Licence, maintenance and what an upgrade actually costs

MeshLab's source is released under the GPL, and the repository carries LICENSE.txt at the top level. For anyone linking MeshLab code into a proprietary product, that is the constraint to read carefully, and the README offers no exception or alternative licensing path. Using the released binary to process your own models is a different question from redistributing a build or incorporating the source, and the licence text, not this article, governs it. The project also asks that you cite it: the Zenodo DOI is 10.5281/zenodo.5114037, and the official page lists further references, including the 2008 Eurographics Italian Chapter Conference paper.

Upgrade cost is dominated by the release cadence rather than by breaking changes. MeshLab-2025.07 arrived on 2025-07-22, more than a year and a half after MeshLab-2023.12. The last push to the repository was on 2026-08-25, so the source is not dormant, but a fix that lands on main and then merges into devel still has to wait for a tagged release before it reaches a binary. If you depend on a specific filter's behaviour, pin the release you validated.

Build cost is real for anyone compiling from source. The scripts folder and src/README.md exist precisely because this is a CMake C++ project with platform-specific deploy steps, and the repository includes a snapcraft.yaml and a .devcontainer directory. For most users the release binary is the sane path, and the source build is for people who need the devel branch or a platform the releases do not cover.

Editorial conclusion

Adopt MeshLab if your input is scanned or reconstructed geometry: large triangle meshes, point clouds, textured PLY or OBJ files, and you need filters for cleaning, simplification and conversion. Do not adopt it if you need parametric solids, constraint-driven modeling or a scriptable headless pipeline as your primary interface; VCGlib is the library for that, and MeshLab is the interactive front end. Before committing, verify the current release on the Releases tab for your platform, check whether the filter you need lives in src or in unsupported, and confirm that the GPL-3.0 terms fit how you plan to redistribute anything you build from the source.

Frequently asked questions

What is MeshLab used for?

MeshLab is used for processing and editing unstructured large 3D triangular meshes, particularly those produced by 3D scanning. Its tools cover editing, cleaning, healing, inspecting, rendering and converting meshes, and it is available for Windows, macOS and Linux.

Is MeshLab free to use?

Yes. The README states that the MeshLab source is released under the GPL License, and the repository includes LICENSE.txt at the top level.

How do I install MeshLab on Ubuntu?

The README does not give a package-manager command. It directs you to the Releases tab for the last MeshLab release for your platform, notes that MeshLab is available for Linux, and offers nightly builds from the last GitHub Actions workflow artifacts. Building from source uses the scripts in the scripts folder, with details in src/README.md.

How do I simplify a mesh in MeshLab?

Simplification is applied as a filter on the loaded mesh, and the parameter to tune is the target number of faces. The README does not document individual filter parameters, so the filter dialog is the reference for the settings available.

How do I fill holes in a mesh in MeshLab?

Hole filling is one of the cleaning and healing operations the README lists among MeshLab's tools for unstructured meshes. The README does not document the filter's parameters or its behaviour on non-manifold boundaries.

Is MeshLab safe to use?

The repository is the official source for MeshLab's source code and binaries, and releases are published on the Releases tab. The README does not make any security claims beyond that, so download from those locations rather than from third-party mirrors.

Official sources

  1. cnr-isti-vclab/meshlab on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/cnr-isti-vclab-meshlab.svg)](https://hysenlabs.com/projects/cnr-isti-vclab-meshlab)