Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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(); }
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);
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