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