sabato 26 gennaio 2013

Animare con OpenGL

Il programma elencato di seguito crea una semplice animazione realizzata utilizzando le funzioni OpenGL.

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

static GLfloat spinta = 1.0;

void inizia(void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}

void mostra(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glPushMatrix();
   glRotatef(spinta, 0.0, 0.0, 1.0);
   glColor3f(0.0, 0.0, 1.0);
   glRectf(-25.0, -25.0, 25.0, 25.0);
   glPopMatrix();
   glutSwapBuffers();
}

void spinMostra(void)
{
   spinta = spinta + 2.0;
   if (spinta > 360.0)
      spinta = spinta - 360.0;
   glutPostRedisplay();
}

void ridisegna(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();
}

void topo(int bottone, int stato, int x, int y)
{
   switch (bottone) {
      case GLUT_LEFT_BUTTON:
         if (stato == GLUT_DOWN)
            glutIdleFunc(spinMostra);
         break;
      case GLUT_MIDDLE_BUTTON:
         if (stato == GLUT_DOWN)
            glutIdleFunc(NULL);
         break;
      default:
         break;
   }
}

/*
 *  funzioni di doppio buffer immagine
 *  funzioni che registrano lo stato del mouse
 */
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize (300, 300);
   glutInitWindowPosition (125, 125);
   glutCreateWindow (argv[0]);
   inizia ();
   glutDisplayFunc(mostra);
   glutReshapeFunc(ridisegna);
   glutMouseFunc(topo);
   glutMainLoop();
   return 0;
}

Nessun commento:

Posta un commento