Asg 8: Rotate a simple A|W object

Objectives

Following Assignment 07, used to display a simple aw_t object, e.g., a simple cube, in this assignment add in the capability to rotate the object.

Assignment

  1. Use the C++ code from Assignment 07 to set up a 3D perspective projection and to manipulate the camera's viewpoint and to read in the A|W object.
  2. Add to the aw_t object three float variables, rotx, roty, and rotz.
  3. Add a public member function rotate(float rx, float ry, float rz) which adds each of the three arguments to each of the rotx, roty, and rotz variables—these store the amount of rotation the object currently is subject to.
  4. Set up keyboard callbacks that adjust the object orientation
  5. Suggested key bindings (if you use different ones, provide a USAGE file):

Details

  1. Camera and OpenGL perspective details are the same as in Assignment 06.
  2. Object I/O is the same as in Assignment 07.

Requirements

  1. When displaying the object, call glRotatef three times, one for each of the rotations about the x- y- and z-axes, e.g., glRotatef(the_objects[i]->rotx,1,0,0) and similarly for the other axes.

Input

  1. The cube-ccw.obj file used to test the above program is:
    v 1.0 1.0 1.0
    v 1.0 1.0 -1.0
    v 1.0 -1.0 1.0
    v 1.0 -1.0 -1.0
    v -1.0 1.0 1.0
    v -1.0 1.0 -1.0
    v -1.0 -1.0 1.0
    v -1.0 -1.0 -1.0
    g cube
    f 1 5 7 3
    f 2 1 3 4
    f 5 6 8 7
    f 6 2 4 8
    f 2 6 5 1
    f 8 4 3 7
    	
  2. An object is represented by a list of vertices, basically a list of 3D points similar to what was used previously to display a plane.
  3. Each vertex is now used in a list of faces (polygons) that define the spatial boundary of the object. For a cube, there are 6 quadrilaterals.
  4. Note that, in general, you cannot assume that all objects are composed of quads; they could be composed on n-sided faces, or polygons. You cannot therefore assume that each face will have 4 indices into the vertex list. There will be at least 3 and at most n where n is unknown. For this reason we use the STL std::vector containers, which keep track of the size of the list.

Output

  1. Expected output with the above input file is whatever you need to help you diagnose and debug the program, e.g.,:
    GL: 2.1 NVIDIA-10.2.1 310.41.15f01 NVIDIA Corporation
    number of verts read in: 8
    number of faces read in: 5
    *** printing object list
    v 1.0 1.0 1.0
    v 1.0 1.0 -1.0
    v 1.0 -1.0 1.0
    v 1.0 -1.0 -1.0
    v -1.0 1.0 1.0
    v -1.0 1.0 -1.0
    v -1.0 -1.0 1.0
    v -1.0 -1.0 -1.0
    g cube
    f 1 5 7 3
    f 2 1 3 4
    f 5 6 8 7
    f 6 2 4 8
    f 2 6 5 1
    	
    it is a good idea to print out the object parsed in, to make sure you can read the object data and then reproduce it by iterating through the vertex and face lists.

  2. When you have the object read in and stored properly, it should show up as below:

Supplemental

  1. Here is a Makefile that you can use to compile the project:
    .SUFFIXES: .c .o .cpp .cc .cxx .C
    
    UNAME = $(shell uname)
    PLATFORM = $(shell uname -p)
    
    CC = g++
    COPTS = -g -Wall
    
    INCDIR =
    LIBDIR =
    
    ifeq ("$(shell uname)", "Linux")
    INC = \
      -I/usr/lib/glut-3.7/include
    LIBDIR = \
      -L/usr/lib -L/usr/X11R6/lib -L/usr/lib/glut-3.7/lib/glut
    LIBS = \
      -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm
    else
    ifeq ("$(shell uname)", "Darwin")
    LIBS = \
      -framework OpenGL -framework GLUT -framework Foundation -lstdc++
    endif
    endif
    
    .c.o:
    	$(CC) -c $(INCDIR) $(COPTS) -o $@ $<
    
    .cpp.o:
    	$(CC) -c $(INCDIR) $(COPTS) -o $@ $<
    
    all : main
    
    OBJECTS = \
    point.o \
    face.o \
    vertex.o \
    aw.o \
    camera.o
    
    main : $(OBJECTS) main.o
    	$(CC) -o $@ $(INCDIR) $(COPTS) $(OBJECTS) $@.o $(LIBDIR) $(LIBS)
    
    point.o: point.h point.cpp
    
    clean :
    	rm -f *.o
    	rm -rf main
    	

Turn in

Turn in all of your code, in one tar.gz archive of your asg##/ directory, including:
  1. A README file containing
    1. Course id--section no
    2. Name
    3. Brief solution description (e.g., program design, description of algorithm, etc., however appropriate).
    4. Lessons learned, identified interesting features of your program
    5. Any special usage instructions
  2. Makefile
  3. source code (.h headers and .cpp source)
  4. object code (do a make clean before tar)

How to hand in

See handin notes

Grading scheme