Assignment #3 -- A Simple Walkthrough


Due Date

This assignment is due at 11:59pm on Monday, March 7th. Projects turned in late will lose point as described in the policies handout. This assignment should be done alone or in pairs. You may share ideas with other groups, but you may not share code.

SUBMISSION DETAILS

You may submit on either Unix, OS X, or Windows. The platform you submit on will be the one used to grade assignments. 

We will be using Prof. Hilfinger's submit software for submission of this assignment, but as a backup you are encouraged to also send a README file as described below. The other comments about what you need to submit (makefile, etc) still apply.

Do not touch any file after the submission date. Readers will check the file time stamps. Regardless of which platform you used for the assignment, you should have an as3 directory in both of your Unix and Windows accounts. You should put a README file into both of these directories that at the minimum contains the following data:

You should also e-mail your README file to cs184@imail.eecs.berkeley.edu. On the subject line you should specify your account names and the assignment number (e.g: cs184-aa, cs184-ab: as3).

All files needed to compile your code should appear in the directory indicated in your README file. It is your responsibility to make sure that they will compile and run properly. You will also need to set the permissions properly.

Windows: The grader should be able to recompile your program by simply opening the project and rebuilding it from scratch.

Unix and OS X: The grader should be able to recompile your program simply by typing "make".

The TAs have provided sample code for you to start with. If you chose to use that code, you are responsible for figuring out how to use properly. If you have questions, post them to the news group or ask the Professor/TAs during their office hours.

You do not have long to do this assigment. Do not wait until the last minute to start!

Check the news group regularly for updates on the assignment or other clarification. We will assume that anything posted there is henceforth known to all.



Overview

The assignment is to create a simple walkthrough program. Your program will read a scene description from a file (described below) and allow a user to interactively explore the environment by pressing the arrow keys. Pressing the "up" arrow key should move the camera in the direction its looking by 0.1 units. Pressing the "down" arrow key should move in the direction the camera is looking by -0.1 units. Pressing the "left" arrow key should rotate the camera 5 degrees to the left and pressing the "right" arrow key should rotate 5 degrees to the right. Holding the "shift" key and pressing the "left" or "right" arrow keys should translate the camera 0.1 units in the appropriate direction (this is known as "strafing").

You will need to setup the correct projections for the camera and render all the objects in the scene. Additionally, you must put an analog clock with hour, minute, and second hands in the lower left hand corner of your viewport. This clock should display the current time of day and be updated every second.

The objects will be read from files using a simplified .obj format. You will need to compute normals for the objects, and hitting the 's' key should toggle between flat and smooth shading.

Your program should accept a single command line argument which is the name of a file containing the scene description.

Pressing the "o" key should return the camera to its original position and pressing "q" should quit the program.

You will be provided with some sample code to get you started and a sample executable should be available shortly. Check the news group reguarly for updates.

This tar file (updated 2/25/05 at 11:00pm) contains the sample code and sample scene from section. This code should compile on macs, linux, and windows. Here are some executables of the TA's version of the project: OSX, Linux and Windows.


Scene File Format

The file begins by specifying the initial camera setup. The first numbers are the field of view, near and far clipping planes. The aspect ratio should be determined from the window size (resize events). The next three numbers specify the x, y, and z coordinates of the eye (center of projection), the next three specify a point that the eye is looking at (often called center) and the last three specify an up direction. These are exactly the parameters to the gluPerspective() and gluLookAt() functions.

The camera description is followed by an integer which specifies the number of objects in the scene. Each object entry first contains the color (3 floats). This is followed by ka, kd, and ks (3 more floats), which are the various reflectances of the object (ka multiplies the ambient term, etc). Then an arbitrary number of transformations may be specified. These are specified either as "translate", "rotate", or "scale." "translate" is folowed by three floats which give the translation. "scale" is followed by 3 floats which give the scale in each coordinate direction. "rotate" is followed by 4 floats, the angle (in degrees) and the axis. The transformations are given in the order they should be added to the stack. That is, the reverse order in which they are applied to points. After the transformations an obj file which contains the actual triangles describing the object is given.

After all the object descriptions, we describe the lights. First, there is an integer which specifies the number of lights. Each light is then specified by ambient, diffuse, and specular colors (each given as four floats (RGBA)) and the position (also 4 floats).

An example scene file is available here.


Simplified OBJ File Format

We will be using a simplified OBJ file format. Lines begin with a "v", for vertex, or "f", for face. The vertices are all listed before the faces. A "v" is followed by 3 floats which specify the position of the vertex. An "f" is followed by three ints which map into the vertex array. That is "f 1 2 3" specifies a triangle made of the first, second and third vertices specified. The indices used to specify the faces start at one (not zero).

An example OBJ file is available here.



Bonus

You can implement the following for additional marks:

Questions should be posted to the news group and/or to cs184@imail.eecs.berkeley.edu.