University of Minnesota
CSCI 5980/8980: Physics-Based Animation

Final Project

For a final project, students are expected to implement a nontrivial simulation algorithm, either following an existing paper from the last 5–10 years, or a novel technique proposed by the student. You should talk to me before choosing a topic. I will post a list of suggested project ideas on this page, but you are encouraged to come up with something that matches your own goals and interests.

Students taking the course as 8980 should include a novel component in their project, as described in the syllabus.

Project may be done individually or in groups of two.


All deliverables should be submitted on the course Moodle site.

Project proposal (10%): Due on Tuesday, October 27.
A 1–2 page summary of the proposed project in SIGGRAPH format. It should include the following parts:

  • Abstract
  • Introduction (what problem you want to solve / phenomenon you want to simulate)
  • Method (a technical description of the algorithm you plan to use)
  • Goals (what you expect to achieve, and how you plan to demonstrate it. Consider including extra “stretch goals” that you would like to try but are not sure if you will have time to complete.)
  • References

Students working individually may choose between writing a final report and giving a final presentation; either will count for 20% of the grade. Teams of two must do both, each counting for 10%. If you are not in a team, email me by Monday, December 7 saying whether you will be submitting a report or giving a presentation.

  • Final report: Due Monday, December 14 at 11:59 pm.
    A 4–6 page report in the style of a technical paper, accompanied by a video demonstrating the results.

  • Final presentation: On the last day of class, Tuesday, December 15.
    A brief presentation (10–12 minutes) in the style of a technical talk, including videos or live demos showing the results of the project.

Late policy: No late days may be used for the presentation. Late days may be used for the report, but the video must be submitted on time so that we can all view it on the presentation day. Failure to submit the video on December 14 will cost 5 points.

The report/presentation should cover roughly the same elements as in the project proposal, but in greater detail:

  • (Report only) Abstract

  • Introduction (4 pts): Define the problem or the phenomenon being simulated.

  • Method: Describe both the overall approach (5 pts) and some of the nontrivial implementation details (5 pts). (Presentation only: as time is limited, omit details that we’ve already covered in class.)

  • Results: Replaces the Goals section. Describe the results you achieved along with some images and videos (3 pts), and discuss the strengths and limitations of your implementation (3 pts). A simulation technique would not be that useful if it could only simulate one specific scenario, so you should show more than one example result.

  • (Two-person teams only) Division of Labor: Briefly describe how the work was divided among the team members.

The Abstract and Division of Labor will cost 1 point each if they are missing when they should be present.

Code (20%):
Fairly self-explanatory. At the end of the term, you will submit the complete source code of your project. It should be able to reproduce all the results shown in your report/presentation.

Grading rubric:

  • 8 pts: Code implements basic functionality related to the project topic

  • 4 pts: Code simulates at least one example

  • 4 pts: Code simulates all examples shown

  • 4 pts: Code is documented to an extent comparable with the homework and project starter codes (i.e. has comments describing the meaning of most variables and the purposes of nontrivial functions)

Suggested topics

For the project, you may either write a stand-alone program, or implement a nontrivial extension to an existing simulation library such as Bullet (for rigid and deformable bodies), Vega FEM (for deformable bodies), ArcSim (for cloth and thin sheets), or Mantaflow (for fluids). Using an existing library will make it easier to get to work on more advanced techniques, but you will have to spend more time to understand how the library works and where to start building on top of it.

One way to choose a topic is to pick a paper from the list on the presentations page (or from Christopher Batty’s list of physics-based animation papers) and implement it, potentially adding some novel extensions of your own. I would recommend picking something from 2005 or later.

Alternatively, you could choose a general area from the list (or even not on the list) and tell me what in particular excites you about it, and I’ll point you to some related papers that you could look into. Similarly, if there’s a specific physical phenomenon that you’re really interested in simulating, let me know and we can discuss it.


I wrote some simple example code for 3D simulations. It includes basic code for:

  • drawing stuff in 3D,
  • loading a mesh and a signed distance function,
  • basic SDF-based collision processing.

I haven’t implemented functionality for dragging things around with the mouse, because it turns out to be rather tricky. In general that’s not a problem for offline simulations: you just set the initial conditions and let it go.

Other useful resources:

  • Eberly, “Polyhedral Mass Properties (Revisited)” (2002–09) gives a simple way to compute the moment of inertia tensor of a triangle mesh.

  • SDFGen by Christopher Batty is a program that computes the signed distance function for a triangle mesh.

  • Going the other way, Bourke, “Polygonising a scalar field” (1994) describes the marching cubes algorithm for getting a triangle mesh from a scalar field.

  • There’s a nice collection of standard 3D models, including the Stanford bunny, the Stanford armadillo, and a bust of Max Planck at the Suggestive Contour Gallery.

  • If you need more that the basic OBJ file reading functionality in the example code above, you can use the trimesh2 mesh processing library by Szymon Rusinkiewicz.

  • MeshLab is a pretty handy mesh viewing and editing application. I use it to convert between mesh formats, as well as to simplify high-resolution meshes so they are easier to work with (Filters > Remeshing, Simplification and Reconstruction > Quadratic Edge Collapse Decimation).

  • If you have time to spare and want to generate high-quality renderings of your results, you could use a physically based renderer such as Mitsuba.

  • If your simulation is computationally intensive and doesn’t run in real time, you should save your simulation data to a sequence of files, and have another program that just reads the files and plays back the animation at the right speed. Then to create a video, you have a couple of options:

    1. You could record your window using a screen capture program like Fraps.

    2. You could directly read the OpenGL render and save it to a sequence of images; here’s some code to do that. Then use a video encoding program like Windows Movie Maker, QuickTime, or FFMPEG to concatenate them into a video (I use ffmpeg -y -f image2 -r 25 -i <image-directory>/%06d.png -vcodec libx264 -preset medium -b 10M <output-video>.mp4). Alternatively, if you’re familiar with the OpenCV library, I’m told it lets you create a video directly from your program.