Rotating a shape is fun, but rotating it with animation is really great.
That's what we are going to see in this glRotatef() tutorial for animating shapes on a window.
Our shape is made up of 3 squares with 3 different colours:
/* * main.cpp */ #include "BadprogRotate.h" /* * Main */ int main(int ac, char* av[]) { BadprogRotate go(&ac, av); return 0; }
/* * BadprogRotate.h */ #ifndef BADPROGROTATE_H_ #define BADPROGROTATE_H_ #include "GL/freeglut.h" #include <string> #define SCREEN_TITLE "Square rotation by BadproG! :D" #define SCREEN_WIDTH 600 #define SCREEN_HEIGHT 600 #define SCREEN_POSITION_X 100 #define SCREEN_POSITION_Y 100 class BadprogRotate { public: static GLfloat S_ANGLE; BadprogRotate(int *ac, char *av[]); virtual ~BadprogRotate(); void init(void); static void managerDisplay(void); static void managerIdle(void); static void managerResize(int, int); static void managerMouse(int, int, int, int); static void managerKeyboard(unsigned char, int, int); }; #endif /* BADPROGROTATE_H_ */
Add the unistd.h file for Windows OS in order to change usleep() by Sleep() in the following managerIdle() method.
/** * BadprogRotate.cpp */ // For windows add the unistd.h file // #include <unistd.h> #include "BadprogRotate.h" /** * Static */ GLfloat BadprogRotate::S_ANGLE = 0; /** * Constructor */ BadprogRotate::BadprogRotate(int *ac, char *av[]) { glutInit(ac, av); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT); glutInitWindowPosition(SCREEN_POSITION_X, SCREEN_POSITION_Y); glutCreateWindow(SCREEN_TITLE); this->init(); glutDisplayFunc(&managerDisplay); glutReshapeFunc(&managerResize); glutMouseFunc(&managerMouse); glutKeyboardFunc(&managerKeyboard); glutIdleFunc(&managerIdle); glutMainLoop(); } /** * Deleting */ BadprogRotate::~BadprogRotate() {} /** * Init */ void BadprogRotate::init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } /** * Display 3 squares on the screen, one rotating from left to right, * another from right to left and the last reducing all their dimensions * to 0 before recovering its original values. */ void BadprogRotate::managerDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); // White square glPushMatrix(); glRotatef(S_ANGLE, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glRectf(-25.0, -25.0, 25.0, 25.0); glPopMatrix(); // Burgundy square glPushMatrix(); glRotatef(S_ANGLE, 0.0, 0.0, -1.0); glColor3f(0.7, 0.2, 0.3); glRectf(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); // Green square glPushMatrix(); glRotatef(S_ANGLE, 0.0, 0.0, 0.0); glColor3f(0.7, 1.0, 0.3); glRectf(-5.0, -5.0, 5.0, 5.0); glPopMatrix(); glutSwapBuffers(); } /** * What's happening when the animation is activated. For Windows, replace usleep() by Sleep(). */ void BadprogRotate::managerIdle(void) { usleep(10000); // change it to Sleep(5.0); for Windows S_ANGLE -= 1; glutPostRedisplay(); } /** * Allow the resizing of the window, perspective is not respected. */ void BadprogRotate::managerResize(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /** * Manage the mouse, if the left button is clicked, we revive the animation. * If the right button is clicked, we stop the animation. */ void BadprogRotate::managerMouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(&managerIdle); break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } (void)(x); (void)(y); } /** * Manage the keyboard, 27 = ESC key. */ void BadprogRotate::managerKeyboard(unsigned char key, int x, int y) { switch (key) { case 27: { exit(0); } break; } (void)(x); (void)(y); }
g++ main.cpp BadprogRotate.cpp -o rotateMe -lglut -lGLU ; ./rotateMe
What would be OpenGL without any animation?
I don't know, but I'm sure you are on the right way to develop your own animations.
Great job, you made it.
Comments
Marina S (not verified)
Thursday, April 2, 2020 - 11:05pm
Permalink
Fantastic code!
Fantastic code!
Add new comment