The following program rotates a cube with color interpolation , where colors are assigned to the vertices and mouse buttons control the direction of the rotation. Create the code  /* cube.cpp */   #include #include   static GLfloat theta[] = {0.0,0.0,0.0}; static GLint axis = 2;   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 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}}; ​ // draw a polygon via list of vertices void polygon(int a, int b, int c , int d) { ​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(); }​   // map vertices to faces void colorcube(void) { ​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); }   // display callback void display(void) {   ​// clear frame buffer and z buffer,   ​// rotate cube and draw, swap buffers   ​glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ​glLoadIdentity(); ​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(); }   // idle callback, spin cube 2 degrees about selected axis void spinCube() { ​theta[axis] += 2.0; ​if( theta[axis] > 360.0 ) theta[axis] -= 360.0; ​glutPostRedisplay(); }   // mouse callback void mouse(int btn, int state, int x, int y) {    ​// selects an axis about which to rotate ​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; }   // reshape callback void myReshape(int w, int h) {    ​glViewport(0, 0, w, h);   ​glMatrixMode(GL_PROJECTION);    ​glLoadIdentity();    ​if (w <= h)        ​    glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,            ​                   2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);    ​else        ​    glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,                                   2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);    ​glMatrixMode(GL_MODELVIEW); }   // main function int main(int argc, char **argv) {    ​glutInit(&argc, argv);      ​// need both double buffering and z buffer    ​glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);    ​glutInitWindowSize(500, 500);    ​glutCreateWindow("Color Cube");    ​glutReshapeFunc(myReshape);    ​glutDisplayFunc(display); ​glutIdleFunc(spinCube); ​glutMouseFunc(mouse); ​glEnable(GL_DEPTH_TEST); // Enable hidden--surface--removal    ​glutMainLoop();      ​return 0; }

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 color interpolation , where colors are assigned to the vertices and mouse buttons control the direction of the rotation. Create the code 


/* cube.cpp */

 

#include <stdlib.h>

#include <GL/glut.h>

 

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

static GLint axis = 2;

 

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

// draw a polygon via list of vertices

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

{

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

}​

 

// map vertices to faces

void colorcube(void)

{

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

}

 

// display callback

void display(void)

{

  ​// clear frame buffer and z buffer,

  ​// rotate cube and draw, swap buffers

  ​glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

​glLoadIdentity();

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

}

 

// idle callback, spin cube 2 degrees about selected axis

void spinCube()

{

​theta[axis] += 2.0;

​if( theta[axis] > 360.0 ) theta[axis] -= 360.0;

​glutPostRedisplay();

}

 

// mouse callback

void mouse(int btn, int state, int x, int y)

{

   ​// selects an axis about which to rotate

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

}

 

// reshape callback

void myReshape(int w, int h)

{

   ​glViewport(0, 0, w, h);

  ​glMatrixMode(GL_PROJECTION);

   ​glLoadIdentity();

   ​if (w <= h)

       ​    glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,

           ​                   2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);

   ​else

       ​    glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,

                                  2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);

   ​glMatrixMode(GL_MODELVIEW);

}

 

// main function

int main(int argc, char **argv)

{

   ​glutInit(&argc, argv);

 

   ​// need both double buffering and z buffer

   ​glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

   ​glutInitWindowSize(500, 500);

   ​glutCreateWindow("Color Cube");

   ​glutReshapeFunc(myReshape);

   ​glutDisplayFunc(display);

​glutIdleFunc(spinCube);

​glutMouseFunc(mouse);

​glEnable(GL_DEPTH_TEST); // Enable hidden--surface--removal

   ​glutMainLoop();

 

   ​return 0;

}

```cpp
/* cube.cpp */

#include <stdlib.h>
#include <GL/glut.h>

static GLfloat theta[] = {0.0, 0.0, 0.0};
static GLint axis = 2;

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

// draw a polygon via list of vertices
void polygon(int a, int b, int c, int d)
{
    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();
}

// map vertices to faces
void colorcube(void)
{
    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,
Transcribed Image Text:```cpp /* cube.cpp */ #include <stdlib.h> #include <GL/glut.h> static GLfloat theta[] = {0.0, 0.0, 0.0}; static GLint axis = 2; 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 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} }; // draw a polygon via list of vertices void polygon(int a, int b, int c, int d) { 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(); } // map vertices to faces void colorcube(void) { 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,
```c
glutSwapBuffers();
}

// idle callback, spin cube 2 degrees about selected axis
void spinCube()
{
    theta[axis] += 2.0;
    if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
    glutPostRedisplay();
}

// mouse callback
void mouse(int btn, int state, int x, int y)
{
    // selects an axis about which to rotate
    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;
}

// reshape callback
void myReshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    if (w <= h)
        glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
                2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
    else
        glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,
                2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
}

// main function
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    // need both double buffering and z buffer
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Color Cube");
    glutReshapeFunc(myReshape);
    glutDisplayFunc(display);
    glutIdleFunc(spinCube);
    glutMouseFunc(mouse);
    glEnable(GL_DEPTH_TEST); // Enable hidden-surface-removal
    glutMainLoop();
    return 0;
}
```

### Explanation

This code is for a 3D graphics application using the OpenGL Utility Toolkit (GLUT). It implements the following key functionalities:

- **Idle Callback (`spinCube`)**: This function rotates a cube by 2 degrees around a selected
Transcribed Image Text:```c glutSwapBuffers(); } // idle callback, spin cube 2 degrees about selected axis void spinCube() { theta[axis] += 2.0; if( theta[axis] > 360.0 ) theta[axis] -= 360.0; glutPostRedisplay(); } // mouse callback void mouse(int btn, int state, int x, int y) { // selects an axis about which to rotate 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; } // reshape callback void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); if (w <= h) glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, 2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); } // main function int main(int argc, char **argv) { glutInit(&argc, argv); // need both double buffering and z buffer glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("Color Cube"); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(spinCube); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST); // Enable hidden-surface-removal glutMainLoop(); return 0; } ``` ### Explanation This code is for a 3D graphics application using the OpenGL Utility Toolkit (GLUT). It implements the following key functionalities: - **Idle Callback (`spinCube`)**: This function rotates a cube by 2 degrees around a selected
Expert Solution
trending now

Trending now

This is a popular solution!

steps

Step by step

Solved in 2 steps

Blurred answer
Knowledge Booster
Array
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
  • SEE MORE 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