aw_t
object, e.g., a simple cube, in this assignment
add in the capability to shade the object via OpenGL's lighting
capability.
face_t
object a float
vector to represent the face's normal, i.e.,
std::vector<float> norm
.
face_t
class
calc_norm(const aw_t& obj)
which computes the face normal via the cross product
of two of the face's edges.
face.h
header file, just above the class face_t
class definition:
class aw_t;
This lets the compiler know that such an object exists.
Don't forget to add
#include "aw.h"
to the top of your face.cpp
implementation file.
C
= B
x A
:
std::vector A(3,0.0), B(3,0.0), C(3,0.0);
// cross product
for(int j=0;j<3;j++)
C[j] = \
B[((3+j-1)%3)] * A[((3+j+1)%3)] - \
A[((3+j-1)%3)] * B[((3+j+1)%3)];
Store (copy) the contents of vector C
into
the face object's norm
vector.
initializeGL()
function,
specify light positions and colors. For example, to specify
both for GL_LIGHT0
GLfloat light0_pos[4] = { -50.0, 0.0, 0.0, 0.0 }; GLfloat light0_color[4] = { .1, .1, .7, 0.25 };specifies a cold blue light along the x-axis. To turn on this light, tell GL that it exists, i.e.,
glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_color);
and then enable this light and GL's lighting system:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
Try setting up a number of lights—GL allows up to
about 8 or 9 (I think).
glNormal3f(the_objects[i]->faces[f]->norm[0],
the_objects[i]->faces[f]->norm[1],
the_objects[i]->faces[f]->norm[2]);
glBegin(GL_POLYGON);
... // specify face vertices via glVertex3f(...)
glEnd();
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
std::vector
containers, which keep track
of the size of the list.
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.
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
tar.gz
archive of your asg##/ directory, including:
README
file containing
Makefile
.h
headers and .cpp
source)
make clean
before tar
)
handin
notes