It's really unreal, man. -Unknown

Nina Amenta, advisor

Danek Duvall, Summer '95 & code shredder/nuker

Tim Rowley, programmer & X zen master

No, I'm not sure exactly why it's called Unreal. We needed a ``snazzy, two-syllable name'' and this is the best we've come up with so far. Read more about the project, and mail me if you have a cool name, or a good phrase whose acronym is Unreal.

The basic idea behind the project is that photorealistically rendered objects,
like what you'd see on a computer screen or in a glossy magazine such as
Scientific American, look really horrible if you print them out or
photocopy them.

Much better pictures are usually drawn by hand. But some objects are really complex, and so it would be nice to have a computer program that would take an object definition and produce a picture that looks hand drawn.

There are many complex issues involved with this. The two specific things we have tackled are edge detection and shading. The code for edge detection works, but is being rebuilt ground-up in such a way that produces more readable code than before and also that lends itself to better efficiency improvements. The current code distinguishes between the following edge types:

- Boundary Edges
- These edges are ``real edges''; i.e., places where the surface ends, such as the edges of a square. By default, these edges are drawn with hollow (or double) lines.
- Horizon Edges (Silhouette Edges)
- These are edges which are created when a surface disappears over the horizon, such as the circular boundary of a sphere. These edges are drawn as thick solid lines.
- Interior Edges
- These are all the edges in the picture that don't fit into any other category. By default, they are drawn as light solid lines, but in most pictures, they have been removed.
- High Angle Edges
- These are the edges lying between two faces which have a high angle between them. The angle is adjustable, and the lines are drawn by default the same as the horizon edges.
- Intersection Edges
- These are the edges which are created by surface intersection. By default, they are drawn as light dashed lines.

Shading is a much thornier problem, and right now we're mostly just talking about the different things we could do. We are looking at engravings of Albrecht Durer for ideas about how to go about shading. Our current thought is to create contours on the objects based upon distance from the light source. With this information in hand, the cross contours are filled in based upon the angle and distance from the light. So far, code has only been written to produce the light contours.

Here is a catenoid. The boundary edges are obvious, and you can see both high-angle edges and a slight horizon edge where the surface disappears in the center.

Here is a dodecahedron. This is a good example of high-angle edges. In fact, it was the motivating surface to introduce such an edge.

Here is a good example of intersection edges. It is the dodecahedron intersecting a sphere.

Here is a seashell. A nice example of boundary, intersection, and horizon edges.

Here is an example of a surface gone wrong. For some reason, our program picks up spurious boundary edges on the torus. So does geomview, for that matter. We're not sure where the problem lies.

Here is another surface which we're not getting quite right. Two boundary edges appear which seemingly shouldn't. But the intersection edges look good.

Below are some images showing the light contours. In the future, we're planning on drawing the cross-contours instead and varying their thickness/intensity based upon angle and distance from the light.