sábado, 26 de noviembre de 2016

EJERCICIO PRIMERO OPENGL

Vamos a hacer un programa en opengl que muestra una esfera verde y la mueve con el teclado ademas cambia de tamaño con las teclas.

El codigo es el siguiente:

/* A simple program to show how to set up an X window for OpenGL rendering.
 * X86 compilation: gcc -o -L/usr/X11/lib   main main.c -lGL -lX11
 * X64 compilation: gcc -o -L/usr/X11/lib64 main main.c -lGL -lX11
 */

 /* Muestra una esfera verde que se mueve con teclado y que se puede variar su
 *  tamano.
 */
#include <stdio.h>
#include <stdlib.h>

#include <GL/glx.h>    /* this includes the necessary X headers */
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glu.h>

#include <X11/X.h>    /* X11 constant (e.g. TrueColor) */
#include <X11/keysym.h>

GLfloat xpos=0, zpos=0, radio=0.2;

/* Rutinas de Render (Dibujado) */
void DibujarMundo( ){
    glMatrixMode(GL_PROJECTION);
    //glLoadIdentity();
    //gluPerspective(5,1,-100,50);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor4f(0.0, 0.0, 0.0,1.0);

/*
........
........
esta rutina dibujaría todos los polígonos que componen
nuestro mundo virtual !
........
........
*/
}

void Dibujar( ){
    /* Dibujo el mundo que me rodea */
    DibujarMundo( );

    /* Representaré a mi personaje con una esfera amarilla */
    /* Activo el color amarillo */
    glLoadIdentity();
    glColor4f(0.0, 1.0, 0.0,1.0);
    glScalef(0.3,0.3,0.3);
    glRotatef(180,0.0,0.0,1.0);
    /* Las funciones referidas a matrices que se observan las comentaré
    ampliamente en el siguiente capítulo, no os preocupéis por ellas */
    glPushMatrix();

        /* Me trasladó a la posición concreta en el mundo */
        glTranslatef(xpos, zpos,0.0);

        /* Dibujo una esfera de radio 2 unidades, y dividida en 16 trozos */
        glutSolidSphere(radio, 16, 16);

    glPopMatrix();

    /* Esta función la explico más adelante en este capítulo */
    glutSwapBuffers( );
}
/* Rutina de control del teclado */
void ControlTeclado(unsigned char key,int x,int y ){
    /* Según la tecla pulsada incremento una u otra variable de movimiento */
    switch(key){
        case 'o':
            xpos++;
            break;
        case 'p':
            xpos--;
            break;
        case 'a':
            zpos++;
            break;
        case 'q':
            zpos--;
            break;
        case 'g':
            radio++;
            break;
        case 'b':
            radio=0.3;
            break;
        case 'v':
            radio=radio-0.1;
            break;
    }
    /* Le digo a OpenGL que dibuje de nuevo cuando pueda */
    glutPostRedisplay( );
}
/* Función MAIN del programa */
int main(int argc, char** argv){
    int id;
    /* Definición típica de la ventana de visualización */

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 400);
    glutInitWindowPosition(100,100);
    id=glutCreateWindow("Ejemplo de control de movimiento");
    /* Definición de los Callbacks que controlaremos */
    /* Cuando haya que dibujar llamaré a ... */
    glutDisplayFunc(Dibujar);
    /* Cuando el usuario pulse una tecla llamaré a ... */
    glutKeyboardFunc(ControlTeclado);
    /* Cuando no esté haciendo nada también dibujaré ... */
    glutIdleFunc(Dibujar);
    glutMainLoop( );

    return 0;
}

No hay comentarios:

Publicar un comentario