#include #include /* The "unit" of translation. */ #define TRANSLATE_UNIT 5 /* The "unit" of rotation (in degrees). */ #define ROTATE_UNIT 5 /* The width and height of the main widnow. */ #define WIDTH 1010 #define HEIGHT 900 int xtrans; /* The amount translated in the X dimension. */ int ytrans; /* The amount translated in the Y dimension. */ int ztrans; /* The amount translated in the Z dimension. */ float vertices[][3] = {{-1.0, -1.0, 1.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0} ,{-1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0} , {1.0, 1.0, -1.0}, {1.0, -1.0, -1.0}}; float fNormalX, fNormalY, fNormalZ; float v1[3]; float v2[3]; float v3[3]; int mainWin; float xmin=0, ymin=0, zmin=0; float xmax=1, ymax=1, zmax=-1; /**************************************************/ /* Lighting Attributes */ /**************************************************/ float light0_ambient[]= {0.1f, 0.1f, 0.1f, 1.0f}; float light0_diffuse[]= {1.0f,1.0f, 1.0f, 0.3f}; float light0_position[]= {0.0f,0.0f, 50.0f, 1.0f}; float light0_specular[]= {1.0, 1.0, 1.0, 0.2}; /**************************************************/ /* Material Attributes */ /**************************************************/ float mat_diff_amb[]= {1.0f, 1.0f, 1.0f, 1.0f}; float mat_emission[] = {0.3, 0.2, 0.2, 0.0}; void display(void); void CalculateVectorNormal( float fVert1[], float fVert2[], float fVert3[], float *fNormalX, float *fNormalY, float *fNormalZ); void keyboard(unsigned char key, int x, int y); int main (int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowPosition(0,0); glutInitWindowSize(800, 800); mainWin = glutCreateWindow("Exploring Clio's Worlds"); glClearColor(0.0, 0.0, 0.0, 0.0); //clear to black glViewport(0,0,800, 800); glMatrixMode(GL_PROJECTION); //sets 'camera' or field of view matrix glLoadIdentity(); //loads current matrix glOrtho(-1.0, 5.0,-1.0, 5.0, 1.0, 5.0); glutDisplayFunc(display); /****************************************/ /* Set up OpenGL lights */ /****************************************/ glEnable(GL_LIGHTING); //Automatically scales normal vectors to unit length glEnable(GL_NORMALIZE); glEnable(GL_LIGHT0); //initial position of light source glLightfv(GL_LIGHT0, GL_POSITION, light0_position); //constant amount of light at every point glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); //partially absorbed/ partially reflected glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); //direction of a perfect reflection glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular); /******************************************************/ /* Set up Material Properties */ /******************************************************/ glEnable(GL_COLOR_MATERIAL); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diff_amb); /***************************************************/ /* Enable z-buffering */ /***************************************************/ glEnable(GL_DEPTH_TEST); glutMainLoop(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Need glOrtho here? glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glPushMatrix(); /* Show X, Y, and Z axis (R,G,B) so that I can tell what's going on. */ glBegin(GL_LINES); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(500.0, 0.0, 0.0); glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 500.0, 0.0); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 500.0); glEnd(); glPopMatrix(); glMatrixMode( GL_MODELVIEW); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION, light0_position); glLoadIdentity(); glColor3f(1.0, 0.0, 0.0); //draw box v1[0]= v2[0] = xmin; v1[1] = ymax; v1[2]= v2[2]= v3[2] = zmax; v2[1] = v3[1] = ymin; v3[0] = xmax; glBegin(GL_QUADS); /* "Front" Face */ glVertex3f(xmin,ymax,zmax); glVertex3f(xmin,ymin,zmax); glVertex3f(xmax,ymin,zmax); glVertex3f(xmax,ymax,zmax); /* "Rear" Face */ glVertex3f(xmax,ymax,zmin); glVertex3f(xmax,ymin,zmin); glVertex3f(xmin,ymin,zmin); glVertex3f(xmin,ymax,zmin); /* "Right" Face */ glVertex3f(xmax,ymax,zmax); glVertex3f(xmax,ymin,zmax); glVertex3f(xmax,ymin,zmin); glVertex3f(xmax,ymax,zmin); /* "Left" Face */ glVertex3f(xmin,ymax,zmin); glVertex3f(xmin,ymin,zmin); glVertex3f(xmin,ymin,zmax); glVertex3f(xmin,ymax,zmax); /* "Top" Face */ glVertex3f(xmin,ymax,zmax); glVertex3f(xmax,ymax,zmax); glVertex3f(xmax,ymax,zmin); glVertex3f(xmin,ymax,zmin); /* "Bottom" Face */ glVertex3f(xmin,ymin,zmin); glVertex3f(xmax,ymin,zmin); glVertex3f(xmax,ymin,zmax); glVertex3f(xmin,ymin,zmax); CalculateVectorNormal(v1, v2, v3, &fNormalX, &fNormalY, &fNormalZ); // Set the normal vector for the polygon glNormal3f(fNormalX, fNormalY, fNormalZ); /* That's it. */ glEnd(); glFinish(); glutSwapBuffers(); } void CalculateVectorNormal( float fVert1[], float fVert2[], float fVert3[], float *fNormalX, float *fNormalY, float *fNormalZ) { float Qx, Qy, Qz, Px, Py, Pz; Qx = fVert2[0]-fVert1[0]; Qy = fVert2[1]-fVert1[1]; Qz = fVert2[2]-fVert1[2]; Px = fVert3[0]-fVert1[0]; Py = fVert3[1]-fVert1[1]; Pz = fVert3[2]-fVert1[2]; *fNormalX = Py*Qz - Pz*Qy; *fNormalY = Pz*Qx - Px*Qz; *fNormalZ = Px*Qy - Py*Qx; } /* * Procedure: * keyboard * Purpose: * React to the user's choice of keyboard key. * Possibilities: * a/A: translate in x axis * w/W: translate in y axis * s/S: translate in z axis * x/X: rotate around x axis * d/D: rotate around y axis * c/C: rotate around z axis * 1-2: select a display scheme */ void keyboard(unsigned char key, int x, int y) { //lPushMatrix(); fprintf(stderr, "%c\n", key); switch (key) { // Restore case ' ': glTranslatef(-xtrans, -ytrans, -ztrans); xtrans = 0; ytrans = 0; ztrans = 0; // Translations case 'a': glTranslatef(TRANSLATE_UNIT, 0.0, 0.0); xtrans += TRANSLATE_UNIT; break; case 'A': glTranslatef(-TRANSLATE_UNIT, 0.0, 0.0); xtrans -= TRANSLATE_UNIT; break; case 'w': glTranslatef(0.0, TRANSLATE_UNIT, 0.0); ytrans += TRANSLATE_UNIT; break; case 'W': glTranslatef(0.0, -TRANSLATE_UNIT, 0.0); ytrans -= TRANSLATE_UNIT; break; case 's': glTranslatef(0.0, 0.0, TRANSLATE_UNIT); ztrans += TRANSLATE_UNIT; break; case 'S': glTranslatef(0.0, 0.0, -TRANSLATE_UNIT); ztrans -= TRANSLATE_UNIT; break; // Rotations case 'x': glRotatef(ROTATE_UNIT, 1.0, 0.0,0.0); break; case 'X': glRotatef(-ROTATE_UNIT, 1.0, 0.0, 0.0); break; case 'd': glRotatef(ROTATE_UNIT, 0.0, 1.0, 0.0); break; case 'D': glRotatef(-ROTATE_UNIT, 0.0, 1.0, 0.0); break; case 'c': glRotatef(ROTATE_UNIT, 0.0, 0.0, 1.0); break; case 'C': glRotatef(-ROTATE_UNIT, 0.0, 0.0, 1.0); break; } // switch //lPopMatrix(); glutPostRedisplay(); } // keyboard s