CS798 Assignment 2: Silhouettes

Due date: February 20th, 2004


At the core of many real-time NPR application is the problem of detecting and rendering silhouettes of 3D models. Numerous approaches have been attempted, and they have varying degrees of success depending on context. You'll implement a "simple" silhouette technique derived from a couple of sources.


The most important paper to read is the WYSIWYG NPR paper from SIGGRAPH 2002. Pay particular attention to Section 4.3 (Stroke Visibility) and Section 5.4 (Silhouettes). It might also help to read some of the references they mention in those sections, notably the Real-Time NPR paper and the Artistic Silhouettes paper. I also recommend Aaron Hertzmann's tutorial on silhouettes; your implementation will be based on his Section 3.3.

You must then construct an interactive viewer for 3D objects that renders them in silhouette style. You should support at least a default mode where the only lines drawn are visible silhouette lines. At the bottom of this page, I'll provide a link to a skeleton implementation you can download as a base for your implementation.

You're required to implement only a small piece of the functionality of the WYSIWYG NPR paper. Here are the core features you need. I'm offering an option in how you implement silhouettes. The text in blue explains the alternative approach you're allowed to take.

Next, you must implement at least one nontrivial extension. This part of the assignment is open-ended, and there are many possible extensions. In this assignment, there are both qualitative extensions (that affect the aesthetics of the output) and quantitative extensions (that affect performance or correctness).

What follows is a short list of suggestions for extensions. You are free (indeed, encouraged) to dream up other ideas. If you're unsure about your idea, or need more guidance, come talk to me.

This part of the assignment is not intended to be overwhelming; it's just a way to get you thinking about what ideas might follow on from the paper. Don't feel you have to wear your fingers down to nubs trying to implement your extension. A proof-of-concept will suffice.

What to submit

You need to produce a short write-up describing your implementation and showcasing the images you created. Your write-up can either be a PDF document or a web page. Your submission should not contain more than about three pages of text, though you're welcome to make it longer by including lots of pictures.

I would prefer for you to make your submission available on the web and mail me a URL by the deadline. If you would prefer not to do that, mail me the PDF or an archive of the web page as an attachment.

You are free to structure your submission as you desire. But it should at least include the following:

You're welcome to include other comments and observations.

By default, I'm not going to look at your source code. But I reserve the right to request it as part of marking if it sounds from your description like there's something worth taking a look at.

I'm likely to book live demonstrations for this assignment; more details will follow.

Implementation notes

You're free to construct your implementation in whatever way you like, as long as it implements the technique described above. This assignment really doesn't rely on anything apart from a 3D graphics library. OpenGL is the obvious choice, though more adventurous students may attempt Direct3D. You'll need some way to read 3D triangle meshes. I recommend the very straightforward OBJ file format. The skeleton program below includes code to read OBJ files.

My implementation is written in a style similar to the assignments in CS488 -- a Python interface (for flexibility) with a C++ back end (for speed). I also use PyOpenGL to do some of the OpenGL work in Python. You can download a skeleton program to get started. You can also find a few interesting OBJ files here. Many, many more can be found by searching around the web.

There are some non-obvious bits of OpenGL that you need to be aware of in order to get good results:

Craig S. Kaplan Last updated: