Anda di halaman 1dari 9

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P.

Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

Laboratorio 03

Diseo de vistas empleando proyecciones geomtricas.

Proyecciones geomtricas y cmara mvil con OpenGL

Objetivo: El objetivo de esta prctica, es que el alumno conozca y sepa manejar apropiadamente las proyecciones (ortogrfica y/o perspectiva) en la elaboracin de una aplicacin con caractersticas interactivas, para esto se incorporar la cmara mvil obtenindose una mayor soltura en cuanto al desplazamiento del usuario. Duracin de la Prctica: 2 Horas. Lugar de realizacin: Laboratorio de cmputo. El conocimiento requerido para realizar esta prctica es de haber asimilado los conceptos bsicos de Visual C++ y OpenGL y la teora necesaria para proyecciones en 2D y 3D. El desarrollo tendr la siguiente estructura: 1. Interaccin y animacin usando GLUT (segunda parte) a. Proyecciones b. Proyeccin ortogrfica c. Proyeccin en perspectiva La cmara mvil Programa ejemplo con OpenGL Ejercicios propuestos. Referencias

2. 3. 4. 5.

Mg. Johnny R. Avendao Q.

Pag. No. 1

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

1. INTERACCIN Y ANIMACIN USANDO GLUT (segunda parte) Para llevar a cabo una animacin no solo se requiere saber transformar la geometra o los elementos que son parte de la animacin, sino que adems hay que elegir como proyectarlos en un sistema de visualizacin que en este caso es bidimensional (nuestro viewport o monitor). Este laboratorio describe dos tipos de proyecciones en concreto adems de tener un control del movimiento y posicin del observador cuando este se desplaza a travs de la escena (almbrica o slida). PROYECCIONES:

Existen dos tipos de proyecciones que son muy usadas para efectos prcticos, las cules son las siguientes: Proyecciones Paralelas. Dependiendo del ngulo que forma con el plano de proyeccin pueden ser: a. Oblicua b. Ortogrfica. Proyecciones en Perspectiva. Dependiendo del nmero de punto de fuga de eje pueden ser: a. 1 punto de fuga b. 2 puntos de fuga c. 3 puntos de fuga

Nosotros nos centraremos en dos de estas proyecciones, la ortogrfica y la perspectiva de un slo punto de fuga.

PROYECCIN ORTOGRFICA:

Como proyeccin paralela que es, cuenta con proyectores todos paralelos entre ellos, el centro de proyeccin (cop) se encuentra en el infinito (lo cul es una convencin); en el caso de la ortogrfica, los proyectores son perpendiculares al plano de proyeccin (lo que se observa mejor en la figura No 1). Este tipo de proyeccin generalmente preserva las dimensiones reales de los objetos segn la distancia hasta ellos (si no observe la aplicacin desarrollada en el los talleres previos). Figura No. 1. Proyeccin ortogrfica Esto quiere decir que an acercndose o alejndose de ellos no se producen cambios de tamao, pero en contraste el realismo no es percibido en su totalidad; estas se utilizan 1 tradicionalmente en proyectos de ingeniera del tipo de programas CAD . Los parmetros a especificar son las dimensiones de la caja: (Xmin, Xmax, Ymin, Ymax, Zmin, Zmax) A los valores Zmax y Zmin tambin se les denomina FAR o BACK y NEAR o FRONT. En OpenGL la podemos definir de la siguiente forma (ya lo habamos visto en algunos ejemplos desarrollados anteriormente):
1

CAD (Computer Aided Design), se refiere a las herramientas computacionales que permiten asistencia a ingenieros, arquitectos y reas de diseo.

Mg. Johnny R. Avendao Q.

Pag. No. 2

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(Xmin, Xmax, Ymin, Ymax, Zmin, Zmax); la ltima funcin puede reemplazarse por: gluOrtho2D(Xmin, Xmax, Ymin, Ymax); si se aceptan los valores por defecto de Zmin=-1.0 y Zmax=1.0 PROYECCIN EN PERSPECTIVA:

Esta es la que definitivamente utilizaremos para dotar del mayor realismo a nuestras aplicaciones. Las proyecciones en perspectiva no siempre preservan las dimensiones reales de los objetos si nos acercamos o alejamos de ellos, pero el efecto visual es justo el deseado en los casos de apariencia real. La perspectiva puede ser estudiada dependiendo del nmero de puntos de fuga de eje: Con 1 punto de fuga de eje. Con 2 puntos de fuga de eje. Con 3 puntos de fuga de eje.
Figura No. 2. Proyeccin en perspectiva

Figura No. 3. Proyeccin con 2 puntos de fuga

En la figura No 2, tenemos una proyeccin perspectiva con un slo COP o punto de fuga. Todos los proyectores emanan de l (o convergen hacia el) y se dirigen hasta el objeto intersecando el plano de proyeccin. Como se puede deducir, los proyectores no son paralelos entre ellos. En OpenGL la podemos definir mediante el siguiente cdigo: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(Angulo,Aspecto,Znear,Zfar); Los parmetros que tenemos que especificar son: Angulo: en grados. Es el "field of view" o campo visual. Se refiere al ngulo de abertura vertical. Aspecto: Relacin de Aspecto o "aspect ratio". Es el cociente entre la anchura (width) y la altura (height) del plano de proyeccin deseado. Y Los valores Znear, Zfar que definen el volumen de visualizacin en perspectiva anlogamente que en la ortogrfica.

Mg. Johnny R. Avendao Q.

Pag. No. 3

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

Figura No. 4. Parmetros de una proyeccin en perspectiva

Tambin podemos definir tambin una proyeccin perspectiva usando la funcin: glFrustrum(left,right,bottom,top,near,far);

Figura No. 4. Parmetros de la funcin glFrustrum

En este caso OpenGL calcular el "frustrum piramidal", es decir, el volumen de visualizacin perspectiva ms idneo. Son simplemente dos maneras distintas de acabar creando lo mismo. Las distancias Znear y Zfar son siempre positivas y medidas desde el COP hasta esos planos, que sern obviamente paralelos al plano Z=0. Dado que la cmara apunta por defecto en la direccin negativa de Z, el plano de front (near) estar realmente situado en z=Zmin mientras que el de back (far) estar en z=-Zmax. 2. LA CMARA MVIL

Todo lo que ella vea ser proyectado, discretizado y finalmente mostrado en nuestra ventana de visualizacin grafica. Podemos imaginar que de la cmara emana el volumen de visualizacin de forma que se traslada con ella. La funcin en OpenGL viene a ser: gluLookAt(eyeX,eyeY,eyeZ,atX,atY,atZ,upX,upY,upZ); En cuanto a los parmetros que demanda la funcin gluLookAt son los siguientes: Coordenadas del "eye". Es literalmente la posicin XYZ dnde colocar la cmara dentro del mundo.
Pag. No. 4

Mg. Johnny R. Avendao Q.

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

Coordenadas del "at". Es el valor XYZ del punto al que queremos que mire la cmara. Un punto del mundo obviamente. Coordenadas del vector "up". Es un vector y no un punto. Con l regularemos la orientacin de la cmara. Este ha de ser el vector que "mira hacia arriba" si entendemos que el vector que apunta hacia adelante es el que va del "eye" hasta el "at". Variando el "up" variamos la orientacin:

Figura No. 6. La cmara mvil

Esta es la funcin que determina dnde y cmo est dispuesta la cmara. Hay que tener presente que la posicin de la cmara no tiene nada que ver con el tipo de proyeccin que hayamos definido. La proyeccin se define slo una vez, tpicamente al principio del programa en una funcin inicializadora, mientras que la cmara se mueve continuamente segn nos convenga. Tome en cuenta que la matriz que se modifica al llamar a esta funcin no tiene que ser GL_PROJECTION si no GL_MODELVIEW. OpenGL calcular todas las transformaciones que aplicar al mundo 3D para que manteniendo la cmara en el origen de coordenadas y enfocada en la direccin negativa de las Z's nos d la sensacin de que lo estamos viendo todo desde un cierto lugar. Para ello siempre se debe activar esta matriz antes de llamar a gluLookAt de esta forma: glMatrixMode(GL_MODELVIEW);

3. PROGRAMA EJEMPLO CON OPENGL Implemente funciones que le permitan desplazarse con libertad en un modelo almbrico (objeto geomtrico); inicialmente, desplazarse hacia delante y hacia a tras, luego girar tanto a la derecha como a la izquierda, y finalmente tener autonoma total, es decir, desplazarse hacia arriba o hacia abajo. Esta aplicacin incluye tambin transformaciones geomtricas, para ello use el cdigo del taller anterior (taller 02). Una posible implementacin es como sigue: #include <stdlib.h> #include<conio.h> #include<stdio.h> #include<math.h> #include <gl/glut.h> void ejes(int); GLdouble angulo=0, incremento_angulo=0.1; GLdouble const radio=0.5; GLfloat px0=0,py0=0,pz0=5; GLfloat px1=0,py1=0,pz1=4; static GLfloat theta[] = {0.0,0.0,0.0}; static GLint axis = 2 ;
Mg. Johnny R. Avendao Q. Pag. No. 5

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

void iniciar(void) { glClearColor (1.0, 1.0, 1.0, 0.0); glShadeModel (GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glLoadIdentity(); // la camara se desplaza sobre el plano xz gluLookAt(px0,0.0,pz0,px1,0.0,pz1,0,1,0); glColor3f (1.0, 0.0, 0.0); ejes(2); glRotatef(theta[0],1.0,0.0,0.0); glRotatef(theta[1],0.0,1.0,0.0); glRotatef(theta[2],0.0,0.0,1.0); glColor3f (0.0, 0.0, 1.0); glutWireDodecahedron(); glFlush(); glPopMatrix(); glutSwapBuffers(); } void CubeSpin() { theta[axis] += .2; if(theta[axis]>360) theta[axis] -= 360.0; display(); } void rotacamara() { px1=px0+radio*sin(angulo); pz1=pz0-radio*cos(angulo); } void avanza() { px0=px1;pz0=pz1; px1=px0+radio*sin(angulo); pz1=pz0-radio*cos(angulo); } void retro() { px1=px0;pz1=pz0; px0=px0-radio*sin(angulo); pz0=pz0+radio*cos(angulo); } void teclado(unsigned char tecla,int x,int y) { switch(tecla){ case 'i' : avanza();break; case 'm' : retro(); break; case 'j' : angulo=angulo+incremento_angulo;rotacamara(); break; case 'k' : angulo=angulo-incremento_angulo;rotacamara(); break; case 'a' : axis = 0; break; case 's' : axis = 1; break; case 'd' : axis = 2; break;
Mg. Johnny R. Avendao Q. Pag. No. 6

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

case 'f' : exit(0); break; } } void ejes(int longitud) { glBegin(GL_LINES); glVertex3d(0,0,longitud); glVertex3d(0,0,0); glEnd(); glBegin(GL_LINES); glVertex3d(0,0,0); glVertex3d(0,longitud,0); glEnd(); glBegin(GL_LINES); glVertex3d(0,0,0); glVertex3d(longitud,0,0); glEnd(); } void myReshape(int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h,0.1, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow("camara movil"); iniciar(); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(CubeSpin); glutKeyboardFunc(teclado); glEnable(GL_DEPTH_TEST); glutMainLoop(); return 0; }

4. EJERCICIOS PROPUESTOS Ejercicio 01: Implemente el cdigo necesario para llevar a cabo las rotaciones hacia arriba y hacia abajo con los respectivos desplazamientos en esas direcciones; de esta manera se debe tener el control total de la cmara. Para esto considere el diseo de la estructura adyacente: La dimensin de A debe ser especificada por el usuario al iniciarse la aplicacin. Note que la figura
Mg. Johnny R. Avendao Q. Pag. No. 7

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

central es un hexgono, tanto en la base como en la parte superior, con dimensiones especificadas en la figura. Como resultado final, el usuario tendr la posibilidad de desplazarse en cualquier direccin a travs de la estructura graficada. El grosor de la estructura deber ser mayor a la de un pxel siendo predefinida en el programa. Nota: Puede consultar las referencias para tener conocimiento de algunas primitivas graficas definidas en OpenGL como por ejemplo: glutWireCube glutWireSphere glutWireCone

Todas estas y otras se hallan en la referencia The OpenGL Utility Toolkit (GLUT) Programming Interface; tambin consulte otras referencias con ejemplos.

Ejercicio 02: Disee su propia primitiva grafica para un cilindro, cuyo formato deber ser: Mi_Cilindro_Wire(Npara,Ncortes) Donde: Npara: es el nmero de lneas verticales a lo largo del cilindro almbrico; a su vez las circunferencias sern aproximadas por un polgono regular de Npara lados. Ncortes: es el nmero de cortes perpendiculares al largo del cilindro; este nmero de cortes coincide con el nmero de circunferencias que conformara el modelo almbrico para el cilindro.

En el grafico adjunto se tiene una representacin con Npara=10 y Ncortes=5. Ejercicio 03: Construir un modelo molecular para representar (modelo almbrico) la molcula del agua H20 tal como se sugiere en la grfica. Sugerencia 1. Use la primitiva diseada en el ejercicio anterior. Sugerencia 2. Use OpenGL si desea manipular slidos (opcional).

Ejercicio 04: Construir un modelo molecular (almbrico) para el Cubano, slido cristalino sintetizado en 1964 por el profesor Philip Eaton de la Universidad de Chicago.

Mg. Johnny R. Avendao Q.

Pag. No. 8

Universidad Nacional Mayor de San Marcos Facultad de Ingeniera de Sistemas e Informtica E.A.P. Ingeniera de Sistemas e Informtica Departamento Acadmico de Ciencias de la Computacin Laboratorio de Computacin Grafica 2012 II

Proyecciones geomtricas y cmara mvil con OpenGL

Enlace de referencia:
http://www.quimicaorganica.net/quimicaorganica/alcanos/alcanos.htm

Nota: Inicialmente use la funcin glutWireSphere de forma apropiada para disear la estructura, cuando todo funcione bien modifique los parmetros (como un solo slido). Importante: centre su estructura en el origen para trabajar correctamente con las transformaciones involucradas, pues todas las representaciones estarn girando o rotando.

5. REFERENCIAS

1. Principles and Practice (Second Edition). Foley J. D., A.van Dam, S.K.Feiner and J.F. Hughes Computer Graphics. Addison-Wesley. 1990 2. OpenGL Superbible. R. Wright and M. Sweet. Waite Group, Inc 1996 3. OpenGL Programming Guide: The Official Guide to Learning OpenGL. D. Sheiner, M. Wood, J. Neider and T. Davis. Addison Wesley, 2007 4. The OpenGL Utility Toolkit (GLUT) Programming Interface (API Version 3). Mark J. Kilgard, Silicon Graphics, Inc 1996 5. The OpenGL Graphics System: A Specification (Version 1.2). Mark segal & Kurt Akeley. Silicon Graphics, Inc 1998

Mg. Johnny R. Avendao Q.

Pag. No. 9

Anda mungkin juga menyukai