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