Geometry Processing, Spring 2026

Michael Kazhdan


Assignment 3: Laplacian Smoothing

Due on March 14 (Saturday) at 11:59 PM


Announcements


Overview

In this assignment you will implement the correct Laplacian smoothing algorithm in which, at each time-step, the vertex positions are updated by performing a semi-implicit time-step of the gradient descent PDE, using the correct bilinear form for stiffness, and transforming the differential of the Dirichlet energy into a gradient. The smoothing will be applied to the x-, y-, and z-coordinates, resulting in the smoothing of the geometry itself.

Getting Started

You should use the code (GeometryProcessing.zip) as a starting point for your assignment. We provide you with numerous files, but you should only have to change the Include/Mesh.inl, Include/RiemannianMesh.[h/inl], and LaplacianSmoothing/LaplacianSmoothing.cpp files. (Feel free to declare and define additional member functions in Include/RiemannianMesh.[h/inl] as you need them.)
Please note that the Include/DynamicMeshViewer.[h/inl] have also been modified.

After you download the files, the first thing to do is compile the LaplacianSmoothing executable.


How to Invoke the Executable

The executable runs on the command line. It takes a geometry file as input, either in ply or in obj file format (determined by the file extension) and opens up an OpenGL-based viewer visualizing progressive smoothing the vertex positions.
To see the supported command line arguments, run the executable without an argyments:
% LaplacianSmoothing
To smooth the geometry, invoke the executable as:
% LaplacianSmoothing --in <input geometry> --stepSize <gradient-descent step-size>
With: The code also supports the following flags:

How to Interact with the Executable

Upon invocation, the executable will open an OpenGL window where the smoothing will be animated.
The basic supported interfaces are:

What You Have to Do

Include/Mesh.inl:
You will need to implement the member function Mesh::g so that, given the index of a triangle, it returns the Eigen::Matrix< double , 2 , 2 > describing the inner-product on the tangent space.
Include/RiemannianMesh.inl:
You will need to modify this file to support the computation of the mass and stiffness matrices. To do this you will need to complete the bodies of the two methods: Please note, that the last argument to both member functions is an object of type MetricFunctor. This is a functor that takes as it's input an integer indexing a triangle and returns a Eigen::Matrix< double , 2 , 2 > object giving the pulled-back inner-product on the tangent space. Your implementation should not need access to the vertices of the mesh.
In your code, you should only have to invoke the functions: as these will extract the necessary from the Mesh object, construct the functor, and pass that along to the functions computing the mass and stiffness matrices.
LaplacianSmoothing/LaplacianSmoothing.inl:
You will need to modify this file to support the factorization of the system matrix in two places: The latter will be invoked if either you modify the step-size (with the '[' and ']' keys), or if you run the executable with either of the --updateMass or --updateStiffness flags (which re-compute the new mass and/or stiffness matrices defined by the updated geometry).
Please see the assignment description for additional details.

Questions


What to Submit

Please submit your implementation on canvas.
For this assignment, you should submit: