Easy3D is a free, open source design & prototyping project written in C++ and released under GPL-3.0. It has 1,656 GitHub stars, 277 forks and 5 open issues, and was last pushed 22 days ago. On this registry it ranks #20 of 23 tracked projects in Design & Prototyping, with 5 head-to-head comparisons available.

What is Easy3D?

Easy3D is a lightweight C++ library with Python bindings for processing and rendering 3D data, built for researchers, educators, and developers who need point clouds, polygonal meshes, polyhedral volumes, and graphs handled efficiently without writing low-level OpenGL code.

What it is

Easy3D is a geometry processing and rendering library implemented in C++ and shipped with Python bindings. It provides data structures for representing and managing 3D models, including point clouds, polygonal surfaces such as triangle meshes, polyhedral volumes such as tetrahedral meshes, and graphs. Per-element properties of arbitrary types are easy to add and access, and non-manifoldness is resolved automatically when models are loaded from files. On top of those structures it bundles widely used algorithms and a set of rendering techniques, and it wraps OpenGL and GLSL at a high level so client code never touches the low-level graphics APIs.

The concrete problem it solves is the gap between raw graphics plumbing and geometry algorithms. Anyone building a 3D tool normally writes shader code, window handling, and drawable management before reaching the actual geometry work. Easy3D lives in the C++ and Python 3D graphics and geometry processing ecosystem, and the thing it replaces is that hand-rolled OpenGL and GLSL layer plus ad-hoc mesh bookkeeping. Compared with geometry processing libraries such as PMP and libigl, which focus on the algorithm aspect, Easy3D also provides a wider range of functionality for user interactions and rendering.

Key capabilities

  • Data structures for point clouds, polygonal surfaces, polyhedral volumes, and graphs, with arbitrary per-element properties and automatic non-manifoldness resolution on load.
  • Algorithms for point cloud normal estimation and re-orientation, Poisson surface reconstruction, RANSAC, mesh simplification, subdivision, smoothing, parameterization, and remeshing.
  • Rendering techniques including point and line imposters, ambient occlusion (SSAO), hard shadow (shadow maps), soft shadow (PCSS), eye-dome lighting for point clouds without normals, and transparency via average color blending and dual depth peeling.
  • High-level OpenGL and GLSL encapsulation using programmable-shader-style rendering with no fixed function calls, so client code avoids the low-level graphics APIs.
  • A directly usable viewer that visualizes 3D scenes in various formats and can be extended, with window and GUI creation supported through GLFW, Qt, and wxWidgets.
  • Drawable-level control such as PointsDrawable::set_impostor_type(PointsDrawable::SPHERE) or PointsDrawable::SURFEL and set_point_size.
  • Step-by-step tutorials covering the data structures, rendering techniques, and algorithms, plus Python bindings and the companion Mapple tool built from the library.

Who uses it and how

  • Researchers and educators who need to prototype geometry processing experiments without building a rendering stack first.
  • Developers starting sophisticated 3D applications, using Easy3D as a callable library with typically only a few lines of code.
  • Teams embedding a viewer in an existing desktop GUI through the Qt viewer in tutorials/Tutorial_204_Viewer_Qt or the wxWidgets viewer in tutorials/Tutorial_203_Viewer_wxWidgets.
  • Python users who want the same data structures and algorithms available to scripts rather than a C++ build.
  • Users of Mapple, the ready-made tool created out of Easy3D for rendering and processing 3D data.

Getting started

The repository root contains a CMakeLists.txt that serves as the anchor for configuring and building the library. Python bindings are provided for using Easy3D from Python scripts.

How it compares

PMP and libigl concentrate on the algorithm aspect of geometry processing, while Easy3D covers a wider range of functionality for user interactions and rendering. Several of its surface mesh processing algorithms were taken from PMP, so it builds on that lineage rather than replacing it outright.

When to use it — and when not to

A self-hoster must configure and build from source with CMake and supply a windowing toolkit such as GLFW, Qt, or wxWidgets plus an OpenGL-capable environment. The project is intended for research and educational purposes, so anyone needing a supported commercial product, a hosted service, or a stable packaged release should look elsewhere. The licence is GPL-3.0, which matters if the code is to be shipped inside a closed-source product.

project readme (upstream, from github) — read inline



3D model generated and rendered by Easy3D

For 3D modeling, geometry processing, and rendering, designed with emphasis on simplicity and efficiency.

Easy3D is implemented in C++ and comes with Python bindings. It is intended for research and educational purposes, but it is also a good starting point for developing sophisticated 3D applications. Compared to existing geometry processing libraries (such as PMP and libigl) that focus on the algorithm aspect, Easy3D also provides a wider range of functionalities for user interactions and rendering.

Key features

  • Efficient data structures for representing and managing 3D models such as point clouds, polygonal surfaces (e.g., triangle meshes), polyhedral volumes (e.g., tetrahedral meshes), and graphs. Easy to add/access arbitrary types of per-element properties. Non-manifoldness is automatically resolved when loading models from files ...

  • A set of widely used algorithms, e.g., point cloud normal estimation/re-orientation, Poisson surface reconstruction, RANSAC, mesh simplification, subdivision, smoothing, parameterization, remeshing, and more (the implementation of several surface mesh processing algorithms were taken from PMP).

  • A bunch of rendering techniques, e.g., point/line imposters, ambient occlusion (SSAO), hard shadow (shadow maps), soft shadow (PCSS), eye-dome lighting (for rendering point clouds without normal information), transparency (average color blending, dual depth peeling), and more.

  • High-level encapsulation of OpenGL and GLSL for convenient and efficient rendering (based on modern and faster programmable-shader-style rendering, i.e., no fixed function calls). Client code does not need to touch the low-level APIs of OpenGL.

  • Step-by-step tutorials demonstrating various uses of the API, to get acquainted with the data structures, rendering techniques, and algorithms for 3D modeling and geometry processing.

  • Very easy to use as a callable library (usually only a few lines of code).

  • A viewer that can be used directly to visualize 3D scenes in various formats, which can also be easily extended. For window/GUI creation, Easy3D currently supports GLFW (e.g., the default viewer), Qt (see the Qt viewer), and wxWidgets (see the wxWidgets viewer).

  • A handy tool Mapple created out of the Easy3D library for rendering and processing 3D data.

  • Python bindings for Easy3D, which allow you to use Easy3D in Python scripts.

Scalar field Polyhedral mesh Keyframe animation

A glance

Any type of 3D drawables (e.g., points, lines, triangles, and thus point clouds, mesh surfaces, scalar fields, and vector fields) can be rendered by writing a few lines of code with Easy3D. For example, the following code renders a point cloud as a set of spheres

// assume your point cloud has been loaded to the viewer
PointsDrawable* drawable = cloud->renderer()->get_points_drawable("vertices");
drawable->set_impostor_type(PointsDrawable::SPHERE); // draw points as spheres.
drawable->set_point_size(3.0f);    // set point size

or as a set of surfels (i.e., 3D discs)

drawable->set_impostor_type(PointsDrawable::SURFEL);

By abstracting geometric elements as one of the above drawables, more general visualization (e.g., vector fields, scalar fields) can be done very conveniently.

Easy3D repository layout

The repository contains a CMakeLists.txt file (in the root directory of the repository) that serves as an anchor for configuring and building programs, as well as a set of subfolders:

  • 3rd_party - source code of third-party libraries
  • applications - applications built on top of Easy3D
  • cmake - CMake-related configuration files
  • docs - documentation configuration file (Doxygen)
  • easy3d - source code of Easy3D, implementing the Easy3D modules:
    • util - utilities, e.g., logging, file system, progress, timer.
    • core - basic types and data structures, e.g., point cloud, surface mesh, graph, and polyhedron mesh.
    • fileio - functionalities for reading/writing data from/into files.
    • kdtree - a collection of kd-trees.
    • algo - algorithms for geometry processing.
    • algo_ext - several extended surface mesh processing algorithms (based on CGAL).
    • video - a class that can encode an image sequence into a video.
    • renderer - functionalities and algorithms for rendering and visualization.
    • gui - tools for user interactions, e.g., picking points, faces, or models.
    • viewer - a simple viewer and a composite viewer.
    • python - Python bindings for Easy3D, and examples.
  • resources - test data, images, shaders, textures, etc.
  • tests - a collection of test cases
  • tutorials - a collection of examples (with detailed explanations in code)

Build Easy3D

Like most software, Easy3D depends on some third-party libraries. Easy3D has made this easier for users by including the source code of most third-party libraries (for the core functionalities and the basic viewer), and it leaves very few optional (for a few additional features that are typically not needed by most users).

The optional third-party libraries are:

  • CGAL (optional): Easy3D has implemented a few algorithms for advanced surface mesh processing, such as surface reorientation, detecting/resolving duplicate vertices/faces and self-intersection, and clipping/splitting/slicing surface meshes. These features are disabled by default (because most users don't need them). To enable these features, you can switch on the CMake option Easy3D_ENABLE_CGAL and make sure CGAL (v5.1 or later) is installed and visible to CMake. In case you have multiple versions of CGAL on your platform, simply provide the path of a suitable one to the CMake variable CGAL_DIR.

  • Qt (optional): Easy3D supports Qt >= v5.6 (v5.14.2, v5.12.12, and v6.7.3 have been tested) for UI creation, which can help develop sophisticated applications for 3D data processing and visualization. The Qt support is disabled by default (because most users don't need it). You can switch on the CMake option Easy3D_ENABLE_QT to include the examples and applications that depend on Qt (e.g., Tutorial_204_Viewer_Qt and [Mapple](https://gi

readme truncated — read the full docs on github

Frequently asked questions

Is Easy3D free to use?

Easy3D is open source under the GPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does Easy3D do?

A lightweight, easy-to-use, and efficient library for processing and rendering 3D data (C++ & Python)

What is Easy3D written in?

Easy3D is primarily written in C++. Its source is publicly available at https://github.com/LiangliangNan/Easy3D, and it has 1,656 GitHub stars.