![]() |
![]() |
![]() |
Home | | Syllabus | |
Assignments | |
Documentation
Solution to Assignment 5, Problem 2
/* CSCI 384 Assign 5. Problem 2--shadow of a pyramid. */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <GL/glut.h> #define PI 3.14159 GLfloat spin= 0.0; GLfloat m[16]; /*Shadow projection matrix*/ GLfloat xLight = 0.0, zLight = 0.0, yLight = 250.0; void myinit(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-250, 250, -250, 250, -250, 250); /*Note, not ortho2D*/ glMatrixMode(GL_MODELVIEW); } /*Set up shadow projection matrix*/ void initShadowMatrix(void){ int i; for (i = 0; i < 16; i++){ m[i] = 0.0; } m[0] = m[5] = m[10] = 1.0; m[7] = -1.0/yLight; } void display(void){ /*Note 3D points here. Set up array of 3D vertices*/ typedef GLfloat point3[3]; point3 vertices[5] = { {0.0, 0.0, 100.0}, {100.0, 0.0, 0.0}, {0.0, 100.0, 0.0}, {-100.0, 0.0, 0.0}, {0.0, 0.0, -100.0} }; int i; /*Note use of Depth buffer bit for hidden surface removal*/ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*Draw regular pyramid*/ glLoadIdentity(); glRotatef(30.0, 1.0, 0.0, 0.0); /*Rotate a bit so can see x-z plane*/ glTranslatef(0.0, 100.0, 0.0); glRotatef(spin, 0.0, 1.0, 0.0); /*Rotate pyramid*/ glScalef(0.75, 0.75, 0.75); /*Draw pyramid*/ glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); for (i=0; i<3; i++){ glVertex3fv(vertices[i]); } glColor3f(0.0, 1.0, 0.0); glVertex3fv(vertices[0]); glVertex3fv(vertices[2]); glVertex3fv(vertices[3]); glColor3f(0.0, 0.0, 1.0); glVertex3fv(vertices[3]); glVertex3fv(vertices[2]); glVertex3fv(vertices[4]); glColor3f(1.0, 0.0, 1.0); glVertex3fv(vertices[4]); glVertex3fv(vertices[2]); glVertex3fv(vertices[1]); glEnd(); glBegin(GL_QUADS); glColor3f(1.0, 1.0, 0.0); glVertex3fv(vertices[0]); glVertex3fv(vertices[3]); glVertex3fv(vertices[4]); glVertex3fv(vertices[1]); glEnd(); glPushMatrix(); /*Save current state*/ /*Draw shadow*/ glLoadIdentity(); glRotatef(30.0, 1.0, 0.0, 0.0); glTranslatef(xLight, yLight, zLight); /*Translate back*/ glMultMatrixf(m); /*Multiply by shadow projection matrix*/ glTranslatef(-xLight, -yLight, -zLight); /*Translate so lightsource is at origin*/ glTranslatef(0.0, 100.0, 0.0); glRotatef(spin, 0.0, 1.0, 0.0); /*Rotate pyramid*/ glScalef(0.75, 0.75, 0.75); glColor3f(0.3, 0.3, 0.3); /*Draw shadow pyramid*/ glBegin(GL_TRIANGLES); for (i=0; i<3; i++){ glVertex3fv(vertices[i]); } glVertex3fv(vertices[0]); glVertex3fv(vertices[2]); glVertex3fv(vertices[3]); glVertex3fv(vertices[3]); glVertex3fv(vertices[2]); glVertex3fv(vertices[4]); glVertex3fv(vertices[4]); glVertex3fv(vertices[2]); glVertex3fv(vertices[1]); glEnd(); glBegin(GL_QUADS); /*Bottom of pyramid*/ glVertex3fv(vertices[0]); glVertex3fv(vertices[3]); glVertex3fv(vertices[4]); glVertex3fv(vertices[1]); glEnd(); glPopMatrix(); glFlush(); glutSwapBuffers(); /*Display next buffer*/ } void idle(void){ spin += 2.0; if (spin > 360.0) spin = spin - 360.0; glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc, argv); /*Note the GLUT_DOUBLE and GLUT_DEPTH here*/ glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); myinit(); initShadowMatrix(); glutInitWindowSize(500,500); glutInitWindowPosition(50,50); glutCreateWindow("Shadow Pyramid"); glutDisplayFunc(display); glutKeyboardFunc(keys); /*Keyboard function, spins pyramid*/ glutIdleFunc(idle); glEnable(GL_DEPTH_TEST); /*For hidden surface removal*/ myinit(); glutMainLoop(); return 0; } Home | | Syllabus | | Assignments | | Documentation
Constance Royden--croyden@mathcs.holycross.edu
|