The following program rotates a cube with mouse clicks. In the display callback, the Lookat function is used to point the viewer, whose location can be altered by the x, X, y, Y, z and Z keys. The perspective view is set in the reshape callback. Create the code  /* cubeview.cpp */

Database System Concepts
7th Edition
ISBN:9780078022159
Author:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Chapter1: Introduction
Section: Chapter Questions
Problem 1PE
icon
Related questions
Question

 

 

The following program rotates a cube with mouse clicks. In the display callback, the Lookat function is used to point the viewer, whose location can be altered by the x, X, y, Y, z and Z keys. The perspective view is set in the reshape callback. Create the code 

/* cubeview.cpp */

 

#include <stdlib.h>

#include <GL/glut.h>

 

GLfloat 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}};

 

GLfloat normals[][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[][3] = {{0.0,0.0,0.0}, {0.0,0.0,1.0},

                      {0.0,1.0,0.0}, {0.0,1.0,1.0}, {1.0,0.0,0.0},

                      {1.0,0.0,1.0}, {1.0,1.0,0.0}, {1.0,1.0,1.0}};

 

void polygon(int a, int b, int c , int d)

{

   glBegin(GL_POLYGON);

       glColor3fv(colors[a]);

       glNormal3fv(normals[a]);

       glVertex3fv(vertices[a]);

       glColor3fv(colors[b]);

       glNormal3fv(normals[b]);

       glVertex3fv(vertices[b]);

       glColor3fv(colors[c]);

       glNormal3fv(normals[c]);

       glVertex3fv(vertices[c]);

       glColor3fv(colors[d]);

       glNormal3fv(normals[d]);

       glVertex3fv(vertices[d]);

   glEnd();

}

 

void colorcube()

{

   polygon(0,3,2,1);

   polygon(2,3,7,6);

   polygon(0,4,7,3);

   polygon(1,2,6,5);

   polygon(4,5,6,7);

   polygon(0,1,5,4);

}

 

static GLfloat theta[] = {0.0,0.0,0.0};

static GLint axis = 2;

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

 

void display()

{

   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();

}

 

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();

}

 

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();

}

 

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);

}

 

int main(int argc, char **argv)

{

   glutInit(&argc, argv);

   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

   glutInitWindowSize(500, 500);

   glutCreateWindow("colorcube");

   glutReshapeFunc(myReshape);

   glutDisplayFunc(display);

   glutMouseFunc(mouse);

   glutKeyboardFunc(keys);

   glEnable(GL_DEPTH_TEST);

   glutMainLoop();

 

   return 0;

}

Expert Solution
trending now

Trending now

This is a popular solution!

steps

Step by step

Solved in 2 steps with 1 images

Blurred answer
Knowledge Booster
Processes of 3D Graphics
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-science and related others by exploring similar questions and additional content below.
Similar questions
Recommended textbooks for you
Database System Concepts
Database System Concepts
Computer Science
ISBN:
9780078022159
Author:
Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:
McGraw-Hill Education
Starting Out with Python (4th Edition)
Starting Out with Python (4th Edition)
Computer Science
ISBN:
9780134444321
Author:
Tony Gaddis
Publisher:
PEARSON
Digital Fundamentals (11th Edition)
Digital Fundamentals (11th Edition)
Computer Science
ISBN:
9780132737968
Author:
Thomas L. Floyd
Publisher:
PEARSON
C How to Program (8th Edition)
C How to Program (8th Edition)
Computer Science
ISBN:
9780133976892
Author:
Paul J. Deitel, Harvey Deitel
Publisher:
PEARSON
Database Systems: Design, Implementation, & Manag…
Database Systems: Design, Implementation, & Manag…
Computer Science
ISBN:
9781337627900
Author:
Carlos Coronel, Steven Morris
Publisher:
Cengage Learning
Programmable Logic Controllers
Programmable Logic Controllers
Computer Science
ISBN:
9780073373843
Author:
Frank D. Petruzella
Publisher:
McGraw-Hill Education