CS798 Assignment 2: Real-time NPR with 3D models

Due date: March 14th, 2008


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. Most recently, Kaplan's HQI paper provides a concise summary of these techniques, and some ideas for speeding them up with additional functionality.

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. If you're working from scratch, I recommend the very straightforward OBJ file format (for which some sample code can also be found in the CS488 skeleton code). An even better choice in C++ would be to start with Szymon Rusinkiewicz's trimesh library for working with meshes.

In 2004 I provided a skeleton program based on Python and PyOpenGL (the linked tarball also includes some sample OBJ meshes). It's doubtful that old sample will still compile without a lot of effort, but you might be able to harvest some ideas from the source code. If I produce a new skeleton program, I'll post it here.

See the Brown Mesh Set for many standard test models in computer graphics.

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: