Está en la página 1de 4

TUTORIAL#1:OpenGLyGLUT

OpenGL(OpenGraphicsLibrary)esunaespecificacinestndarquedefineunaAPI multilenguajeymultiplataformaparaescribiraplicacionesqueproduzcangrficos2Dy3D.La interfazconsisteenmsde250funcionesdiferentesquepuedenusarseparadibujarescenas tridimensionalescomplejasapartirdeprimitivasgeomtricassimples,talescomopuntos, lneasytringulos. GLUT(delinglsOpenGLUtilityToolkit)esunabibliotecadeutilidadesparaprogramas OpenGLqueprincipalmenteproporcionadiversasfuncionesdeentrada/salidaconelsistema operativo.Entrelasfuncionesqueofreceseincluyendeclaracinymanejodeventanasyla interaccinpormediodetecladoyratn.Tambinposeerutinasparaeldibujadodediversas primitivasgeomtricas(tantoslidascomoenmodowireframe)queincluyencubos,esferasy teteras.Tambintienesoporteparacreacindemensemergentes. AntesdetrabajarconOpenGLdebemostenernuestroentornodetrabajolistoparafuncionar conOpenGL,peroesodependedequecompiladorusemos,asqueunavisitaagooglenocae mal,yaqueestoseextenderademasiadoexplicarcmoconfigurarcadacompilador Luegodetenernuestrocompiladorconfiguradopasemosalobsico:
#include <stdio.h> #include <stdlib.h> #include <GL/glut.h> void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Tutorial 1"); glutDisplayFunc(renderScene); glutMainLoop(); }

Estoesloquellamaremosnuestroesqueletoinicial,conestaplantillapodremosagregartodo loquenecesitemosparahaceraplicacionesconOpenGL,ahoraunabreveexplicacindelas funcionesmsimportantes: glutInit(&argc,argv):InicializalasoperacionesdeOpenGLyGlut,esnecesarioquehayasido llamadaantesdeusarcualquierfuncindeGlut. glutCreateWindow():CreaunaventanadeOpenGL,aqumostraremostodoloquevayamosa dibujar,loquenosfacilitatrabajarconventanasnoimportaseaWindowsoLinuxelambiente.

glutDisplayFunction(funcin):conestainstruccinleindicamosaGlutquefuncinseusara paraeldibujodelapantalla,dentrodeesafuncintendremostodasnuestrasinstruccionesy primitivasdeOpenGL. glutMainLoop():indicaqueempecemosamostrarimgenesconGlut,elllamaraalafuncin definidaporglutDisplayFunctionylallamaraporuncicloinfinitohastaquesecierrela ventana. Estapequeaplantillanosmostrarauntrianguloenpantalla,perohastaah,nonosdamas interaccinconelusuario.

Interaccinconelratn:
Ahoravamosaagregarfuncionesparapodermanejarelratn: Agreguemosunafuncinllamadamovimientoconestecdigo:
void movimiento(int boton, int estado, int x, int y) { if ((estado == GLUT_DOWN) && (boton== GLUT_LEFT_BUTTON)) { printf("Se presiono el boton izquierdo\n"); } }

Yluegoenlafuncinmainagregamosestalnea:
glutMouseFunc(movimiento);

Ahora cada vez que presionemos el botn izquierdo dentro de la ventana se nos indicara por la consola. Probemos otra cosa, agreguemos la siguiente funcin al cdigo: void pasivo(int x,int y) { printf("no hago nada\n"); }

Yenelmaincoloquemosestalnea:
glutPassiveMotionFunc(pasivo);

Ahora,cadavezquemovamoselratnsinpresionarningnbotnnosimprimirporconsola lafrasenohagonada

Interaccinconelteclado:
Yaaprendimoscomomanipulareventosdelratndeunamanerabsica,ahoratocaremosel temadeltecladoenGlut,enGlutsemanejandostiposdeteclas,lasteclasnormalesquesera todoelalfabetoynmeros,ylasteclasespecialesqueseralaserieF1aF12,flechasde direccin,Home,End,Insert,Delete,PgUpyPgDn.Estosdostiposdeteclassemanejandela siguientemanera: Agreguemosestafuncinalprograma:
void teclado(unsigned char key, int x, int y) { if (key == 27) exit(0); }

Enlafuncinmainagreguemosestalnea:
glutKeyboardFunc(teclado);

AhorapodremossalirdelprogramaalpresionarlateclaEsc,quevendrasiendo27enASCII,lo quenosindicaqueglutKeyboardFuncnospermitecapturarcualquierteclaqueserepresente poruncdigoASCII. Ahoraveamoscomoagregarcontroldeteclasespeciales: Denuevo,agregamosalcuerpodelprogramaestafuncin:


void especiales(int key,int x,int y) { if(key==GLUT_KEY_F1) exit(0); }

Yenlafuncinmaincolocamossudeclaracincorrespondiente:
glutSpecialFunc(especiales);

Luegodecompilaryprobarelcdigo,ahorapodremossalirdelaaplicacinalpresionarla teclaF1.

Todoescuestindeperspectiva:
Parafinalizar,vamosadarlenuestroprogramauntoquedeperspectiva,paraquealdibujaren pantallaseveanconunefectodeprofundidad.Paraestocolocaremosunavistade45gradosy explicaremosalgomuyimportantealahoradetrabajarconOpenGLquesonlasmatrices GL_PROJECTIONyGL_MODELVIEW.La1eramatrizeslaquecontrolalaperspectivadela imagenydesdequpuntosepuedever,encambioGL_MODELVIEWseencargadequelas transformacionesquesehaganseapliquenalosobjetosens.Veamosunejemplo:

void cambiarTamano(int w, int h) { // Previene una division por cero, cuando la ventana es muy pequea if(h == 0) h = 1; float ratio = 1.0* w / h; // Reinicia la matriz de Proyeccion antes de utilizarla. glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Fija el punto de vision para toda la ventana. glViewport(0, 0, w, h); // Definimos la perspectiva correcta. glMatrixMode(GL_PROJECTION);// Seleccionala matriz de Proyeccion glLoadIdentity(); // Reinicia la matriz de Proyeccion // Calcula la relacion de aspecto de la ventana. gluPerspective(45.0f,ratio,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Selecciono la matriz de Modelo

Yenlafuncinmainahoraagregamosestalnea:
glutReshapeFunc(cambiarTamano);

Graciasaesto,tendremosnuestrosobjetosenperspectivayveremostodoloqueestedesde elorigenhasta100unidadesdeprofundidad,loquenosayudaraenfuturostalleres.Peroal colocarestecdigonuestrafiguradesapareci!Yaquecolocamoslaperspectivadesde0.1fy losobjetosdibujadosestnen0.fasquelasfigurasestarndetrsdenosotrossegnla cmara,acomodemosolosobjetosolacmaraparapoderverlosbien. Ahoracomoejerciciotratedehaceruncuboconuncolorencadacara,paraestousela primitivaGL_QUADSparadibujarloscuadradosycoloquelosvrticescorrespondientespara verelcubo Referencias: OpenGL@Lighthouse3Dhttp://www.lighthouse3d.com/OpenGL/glut/index.php NeHeProductionshttp://nehe.gamedev.net

También podría gustarte