16
PROGRAM 8 Program to draw a color cube and allow the user to move the camera suitably to experiment with perspective viewing. Use OpenGL functions.

10CSL67 CG LAB PROGRAM 8

Embed Size (px)

Citation preview

Page 1: 10CSL67 CG LAB PROGRAM 8

PROGRAM 8

Program to draw a color cube and allow the user tomove the camera suitably to experiment withperspective viewing. Use OpenGL functions.

Page 2: 10CSL67 CG LAB PROGRAM 8
Page 3: 10CSL67 CG LAB PROGRAM 8

#include<GL/glut.h>

GLfloat vertices[8][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}

};

GLfloat colors[8][3] = {{0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}, {0.0,0.0,0.0},{1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}

};

GLfloat theta[] = {0.0,0.0,0.0};GLint axis = 2; /* default z-axis rotation – 0(x axis), 1(y axis), 2(z axis)*/

GLdouble viewer[]= {0.0, 0.0, 5.0}; /* initial viewer location */

Page 4: 10CSL67 CG LAB PROGRAM 8

void polygon(int a, int b, int c , int d)/* draw a polygon via list of vertices */ {

glBegin(GL_POLYGON);glColor3fv(colors[a]);glVertex3fv(vertices[a]);glColor3fv(colors[b]);glVertex3fv(vertices[b]);glColor3fv(colors[c]);glVertex3fv(vertices[c]);glColor3fv(colors[d]);glVertex3fv(vertices[d]);

glEnd();

}

Page 5: 10CSL67 CG LAB PROGRAM 8

/* map vertices to faces */ void colorcube(){

polygon(0,3,2,1); // front face – counter clockwisepolygon(4,5,6,7); // back face – clockwise

polygon(2,3,7,6); // front face – counter clockwisepolygon(1,5,4,0); // back face – clockwise

polygon(1,2,6,5); // front face – counter clockwisepolygon(0,4,7,3); // back face – clockwise

}

0 3

1 2

4 7

5 6

Page 6: 10CSL67 CG LAB PROGRAM 8

void display(void) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/* Update viewer position in modelview matrix */glLoadIdentity();gluLookAt(viewer[0],viewer[1],viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

/* rotate cube */glRotatef(theta[0], 1.0, 0.0, 0.0);glRotatef(theta[1], 0.0, 1.0, 0.0);glRotatef(theta[2], 0.0, 0.0, 1.0);

colorcube();glFlush();glutSwapBuffers();

}

Camera position

Page 7: 10CSL67 CG LAB PROGRAM 8

void mouse(int btn, int state, int x, int y) {if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;theta[axis] += 2.0;if( theta[axis] > 360.0 ) theta[axis] -= 360.0;display();}

Page 8: 10CSL67 CG LAB PROGRAM 8

void keys(unsigned char key, int x, int y) {

/* Use x, X, y, Y, z, and Z keys to move viewer */if(key == 'x') viewer[0]-= 1.0;if(key == 'X') viewer[0]+= 1.0;if(key == 'y') viewer[1]-= 1.0;if(key == 'Y') viewer[1]+= 1.0;if(key == 'z') viewer[2]-= 1.0;if(key == 'Z') viewer[2]+= 1.0;display();

}

Page 9: 10CSL67 CG LAB PROGRAM 8

void myReshape(int w, int h) {

glViewport(0, 0, w, h);/* Use a perspective view */glMatrixMode(GL_PROJECTION); glLoadIdentity();if(w<=h)glFrustum(-2.0, 2.0, -2.0 *(GLfloat) h/(GLfloat) w,

2.0*(GLfloat) h/(GLfloat) w, 2.0, 20.0);else glFrustum(-2.0, 2.0, -2.0 *(GLfloat)w/(GLfloat) h,2.0* (GLfloat) w / (GLfloat) h, 2.0, 20.0);glMatrixMode(GL_MODELVIEW);

}

Page 10: 10CSL67 CG LAB PROGRAM 8

void main(int argc, char **argv) {

glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize(500, 500);glutCreateWindow("Colorcube Viewer");glutReshapeFunc(myReshape);glutDisplayFunc(display);glutMouseFunc(mouse);glutKeyboardFunc(keys);glEnable(GL_DEPTH_TEST);glutMainLoop();

}

Page 11: 10CSL67 CG LAB PROGRAM 8

View volume - Projections

Two types of Projections:

• Orthographic (parallel) projections :the view volume is box-shaped

• perspective projections :have a view volume shaped like a truncated pyramid.

Page 12: 10CSL67 CG LAB PROGRAM 8

Perspective Projection

Frustum View volume

Page 13: 10CSL67 CG LAB PROGRAM 8

Perspective Projection

• Objects outside the view volume not displayed. • View volume has two planes.

• The front face is called near plane. • The back face is called far plane.

• All vertical planes from near plane to far plane define the clipping area.

Page 14: 10CSL67 CG LAB PROGRAM 8

Perspective Projection

Page 15: 10CSL67 CG LAB PROGRAM 8

Perspective Projection

Page 16: 10CSL67 CG LAB PROGRAM 8

void glFrustum(GLdoubleleft, GLdoubleright, GLdoublebottom, GLdoubletop,GLdoublenear, GLdoublefar)

glFrustum computes a viewing frustum in the world coordinates.

• left and right • Specify the coordinates for the left and right vertical clipping

planes. • bottom and top

• Specify the coordinates for the bottom and top horizontal clipping planes.

• near and far• Specify the distances to the near and far depth clipping planes.

Both distances must be positive.

• Note: “near” and “far” are only clipping planes. Neither of them have anything to do with the projection plane.

Perspective Projection