OpenGL program for simple Animation (Revolution) in C
OpenGL is a cross-language, cross-platform API for rendering 2D and 3D Vector Graphics. Using this, we can make a lot of design as well as animations. Below is the simple animation made using OpenGL.
Approach :
To make a picture moving, we need to understand the working procedure of a function used to display i.e glClear(GL_COLOR_BUFFER_BIT). Its task is to clear screen with default value after a certain time (normally, after 1/30 sec or 1/60 sec). So, if any change of coordinate happens, then it will appear to be moving as human eye can distinguish image only which is separated by 1/16 second (persistence of vision).
Now, the coordinates of circle are X = r*cos(θ) and Y = r*sin(θ) or for ellipse X = rx*cos(θ) and Y = ry*cos(θ) where rx and ry are radius in X- and Y- direction and θ is the angle.
If we vary θ from 0 to 2*pi (360 degree) at very small increase (say of 1 degree) and draw point on that coordinate, we can make a complete circle or ellipse. We can also make semi-circle or any arc of circle or ellipse by varying the starting and ending value of θ (angle).
These concepts are used to draw the following Animation:
- 7 horizontal parts of ellipse and 3 vertical complete ellipse as well as 1 outer circle and one outer ellipse are used to visualise an orbit drawn by adjusting the θ as well as radius.
- One vertical line is drawn to make the figure. Then to make it move, an other loop is given where value of j changes with very small amount to make the motion smoother.
- Since, we had to make all point moving in same type of motion to keep the figure together, so equation of motion, that is, glVertex2i(x/2 – 600*cos(j), y/2 – 100*sin(j)) is given inside every inner for loop, so that it can be applied to all points altogether.
For working on Ubuntu operating system:
gcc filename.c -lGL -lGLU -lglut -lm where filename.c is the name of the file with which this program is saved.
Below is the implementation in C.
C
// C Program to illustrate // OpenGL animation for revolution #include<stdio.h> #include<GL/glut.h> #include<math.h> // global declaration int x, y; float i, j; // Initialization function void myInit ( void ) { // Reset background color with black (since all three argument is 0.0) glClearColor(0.0, 0.0, 0.0, 1.0); // Set picture color to green (in RGB model) // as only argument corresponding to G (Green) is 1.0 and rest are 0.0 glColor3f(0.0, 1.0, 0.0); // Set width of point to one unit glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Set window size in X- and Y- direction gluOrtho2D(-780, 780, -420, 420); } // Function to display animation void display ( void ) { // Outer loop to make figure moving // loop variable j iterated up to 10000, // indicating that figure will be in motion for large amount of time // around 10000/6.29 = 1590 time it will revolve // j is incremented by small value to make motion smoother for (j = 0; j < 10000; j += 0.01) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POINTS); // Iterate i up to 2*pi, i.e., 360 degree // plot point with slight increment in angle, // so, it will look like a continuous figure // Loop is to draw outer circle for (i = 0;i < 6.29;i += 0.001) { x = 200 * cos (i); y = 200 * sin (i); glVertex2i(x, y); // For every loop, 2nd glVertex function is // to make smaller figure in motion glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } // 7 loops to draw parallel latitude for (i = 1.17; i < 1.97; i += 0.001) { x = 400 * cos (i); y = -150 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 1.07; i < 2.07; i += 0.001) { x = 400 * cos (i); y = -200 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 1.05; i < 2.09; i += 0.001) { x = 400 * cos (i); y = -250 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 1.06; i < 2.08; i += 0.001) { x = 400 * cos (i); y = -300 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 1.10; i < 2.04; i += 0.001) { x = 400 * cos (i); y = -350 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 1.16; i < 1.98; i += 0.001) { x = 400 * cos (i); y = -400 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 1.27; i < 1.87; i += 0.001) { x = 400 * cos (i); y = -450 + 300 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } // Loop is to draw vertical line for (i = 200; i >=- 200; i--) { glVertex2i(0, i); glVertex2i(-600 * cos (j), i / 2 - 100 * sin (j)); } // 3 loops to draw vertical ellipse (similar to longitude) for (i = 0;i < 6.29; i += 0.001) { x = 70 * cos (i); y = 200 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 0; i < 6.29; i += 0.001) { x = 120 * cos (i); y = 200 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } for (i = 0; i < 6.29; i += 0.001) { x = 160 * cos (i); y = 200 * sin (i); glVertex2i(x, y); glVertex2i(x / 2 - 600 * cos (j), y / 2 - 100 * sin (j)); } // Loop to make orbit of revolution for (i = 0; i < 6.29; i += 0.001) { x = 600 * cos (i); y = 100 * sin (i); glVertex2i(x, y); } glEnd(); glFlush(); } } // Driver Program int main ( int argc, char ** argv) { glutInit(&argc, argv); // Display mode which is of RGB (Red Green Blue) type glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // Declares window size glutInitWindowSize(1360, 768); // Declares window position which is (0, 0) // means lower left corner will indicate position (0, 0) glutInitWindowPosition(0, 0); // Name to window glutCreateWindow( "Revolution" ); // Call to myInit() myInit(); glutDisplayFunc(display); glutMainLoop(); } |
This article is contributed by Aditya Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Please Login to comment...