// CGL Assignment-8
// Animation using OpenGL
// Problem Statement: Write a program in OpenGL on Linux and perform to animate any one
scene (Windmill)
#include <GL/gl.h>
#include <GL/glut.h>
#include <math.h>
// global variable diclaration
int frameNumber = 0; // frame no
void drawWindmill() // Function to draw windmill
{
int i;
glColor3f(0.0, 0.0, 0.0); // red green blue
glBegin(GL_POLYGON);
glVertex2f(-0.05f, 0); // for drawing rectangular base part
glVertex2f(-0.05f, 3);
glVertex2f(0.05f, 3);
glVertex2f(0.05f, 0);
glEnd();
glTranslatef(0, 3, 0); // x,y,z
glColor3f(1.0, 0.0, 0.0); // red,green,blue (RED PLATES OF WINDMILL)
glRotated(frameNumber * (180.0 / 45), 0, 0, 1); //(angle,x,y,z)
for (i = 0; i < 4; i++) // LOOP TO DRAW FOUR PLATES
{
glRotated(90, 0, 0, 1); // 90,0,0,Z
glBegin(GL_POLYGON);
glVertex2f(0, 0); // FOR DRAWING TYIANGLULAR PLATE
glVertex2f(1.0f, 0.2f);
glVertex2f(1.0f, -0.2f);
glEnd();
}
}
void display() // DISPLAY FUNCTION
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity(); // TAKES IDENTITY MATRIX
glPushMatrix(); // PUSH MATRIX
glTranslated(2.2, 1.6, 0); // SET POSITION OF WINDMILL
glScaled(0.4, 0.4, 1); // SCALLING WINDMILL WITH POINT (0.4,0.4,1)
drawWindmill(); // FUNCTION CALL TO DRAW WINDMILL
glPopMatrix(); // POP MATRIX
glPushMatrix(); // PUSH MATRIX
glTranslated(3.7, 0.8, 0); // SET POSITION OF WINDMILL
glScaled(0.7, 0.7, 1); // SCALLING WINDMILL WITH POINT(0.7,0.7,1)
drawWindmill(); // FUNCTION CALL TO DRAW WINDMILL
glPopMatrix(); // POP MATRIX
glutSwapBuffers(); // SWAP BUFFER
}
void doFrame(int v)
{
frameNumber++; // INCREMENT FRAME NO
glutPostRedisplay(); // POST REDISPLAY
glutTimerFunc(10, doFrame, 0);
}
void init() // FUNCTION INITIALISATION
{
glClearColor(1, 1, 1, 0);
glMatrixMode(GL_PROJECTION); // MATRIX MODE FOR PROJECTION
glLoadIdentity(); // LOADS IDENTITY MATRIX
glOrtho(0, 7, -1, 4, -1, 1); // MIN X,MAX X,MIN Y,MAX Y,MIN Z,MAX Z VALUE
glMatrixMode(GL_MODELVIEW); // MATRIX MODE FOR MODEL VIEW
}
int main(int argc, char **argv) // MAIN FUNCTION
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(700, 500); // DEFINED WINDOW SIZE 700*500
glutInitWindowPosition(100, 100); // DEFINED WINDOW POSITION 100,100
glutCreateWindow("Windmill Animation"); // NAME OF WINDOW
init(); // FIRSTLY CALL TO INTIALISE VALUE
glutDisplayFunc(display); // DISPLAY
glutTimerFunc(200, doFrame, 0); // TIMER FUNC
glutMainLoop();
return 0;
}