[Tutorial] II.2 - glutReshapeFunc()

Ver el tema anterior Ver el tema siguiente Ir abajo

[Tutorial] II.2 - glutReshapeFunc()

Mensaje  HarZe el Mar Jul 21, 2009 10:10 pm

II.2 El uso común de glutReshapeFunc():
Novedades:
  • glViewport()
  • glOrtho()

A través de glutReshapeFunc() podemos decidir qué sucederá cuando la ventana cambie de tamaño, podemos usarlo incluso como herramienta de control para el programa, pero no es lo habitual, de todas formas, tienes esa libertad y ahíe stá tu imaginación.
El ejemplo más indicado es que la ventana se deforme sin perder las proporciones del contenido, es decir, si ensanchas la ventana, verás más cosas a los lados, no se achatará la imagen. Ahí el código ejemplo:
Código:
#include <GL/glut.h>

void IniciarGLUT() {
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(600,200);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Practica II,2 de OpenGL");
}
   
void PintarEscena() {
   glMatrixMode(GL_MODELVIEW);
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();
   
   float x1 = -200.0f;
   float y1 = -10.0f;
   float x2 = -180.0f;
   float y2 = 10.0f;
   
   float rojo = 1.0f;
   float verde = 0.0f;
   
   int i;
   for (i=0;i<10;i++) {
        glColor3f(rojo,verde,0.0f);
        glRectf(x1,y1,x2,y2);
        x1 = x1 + 40.0f;
        x2 = x2 + 40.0f;
        rojo = rojo - 0.1f;
        verde = verde + 0.1f;
   }

   glutSwapBuffers();
}

void ReProyectar(int w, int h) {
   GLfloat formato;

   if(h == 0) h = 1;
      
    glViewport(0, 0, w, h);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   formato = (GLfloat)w / (GLfloat)h;
    if (w <= h) glOrtho (-100.0f, 100.0f, -100.0f / formato, 100.0f / formato, 1.0f, -1.0f);
    else glOrtho (-100.0f * formato, 100.0f * formato, -100.0f, 100.0f, 1.0f, -1.0f);
   }

int main(int argc, char **argv)
{
   glutInit(&argc,argv); //Solo necesario en Linux
  IniciarGLUT();
 
  glutReshapeFunc(ReProyectar);
  glutDisplayFunc(PintarEscena);
 
  glutMainLoop();
    return 0;
}


Como se ve en las imágenes, aunque cambie la ventana su forma, no lo hace su contenido, ya que siguen siendo cuadrados. En resumen, 10 cuadrados que van desde el rojo al verde, desde la posición en X de -200 hasta 200. Si la ventana toma forma cuadrada, solo se ven 5 cudrados (de -100 a 100) que según el código, da igual cuanto estreches la imagen, siempre se verá ese mínimo de espacio en X. Al igual que en Y, por mucho que lo achates, siempre se verá de 100 a -100. Experimenta, y atiende a lo nuevo del código, y entenderás este programa.
No es el objetivo principal de este tutorial, pero aparte del GLUT, trataremos aquí las formas de proyección, aquí en concreto la ortogonal, o sea, 2D.

Explicación del código (lo nuevo del código):
El código funciona igual que el anterior, asi que me voy a centrar en lo nuevo.
La función ReProyectar(), se hace un algoritmo, unas operaciones, para hacer que la imagen resultante se muestre según las proporciones nuevas de la ventana:
Código:
   GLfloat formato;

   if(h == 0) h = 1;
      
    glViewport(0, 0, w, h);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   formato = (GLfloat)w / (GLfloat)h;
    if (w <= h) glOrtho (-100.0f, 100.0f, -100.0f / formato, 100.0f / formato, 1.0f, -1.0f);
    else glOrtho (-100.0f * formato, 100.0f * formato, -100.0f, 100.0f, 1.0f, -1.0f);
El formato de la imagen (las clásicas son 4:3, 16:9, etc) se declara, GLfloat es un tipo de variable de OpenGL (aunque en realidad es un float normal y corriente, esto es para una mejor organización de para que es la variable). Se evita después una división entre 0 (que daría infinito y sería error de ejecución). La función glViewport() define en que zona de la ventana se pintará desde ahora, conviene volver a establecerlo si cambia de posición la ventana, también puede servir para administrar el dibujado zona a zona, detalles en el sumario.
Con la función glMatrixMode(), ya comentada, ponemos el modo proyección (en el próximo tuto, se explica esta función y otras relacionadas), y luego definimos la proyección ortogonal con glOrtho(), en 2D, en función del formato. Con esa función, definimos un espacio virtual, indicando en mínimo y máximo en los ejes XYZ.

La función PintarEscena(), sería entrar en C puro para explicarlo. Pero lo comentaré un poco, como la función glRectf() forma un cuadrado dando las coordenadas (X,Y) de las dos esquinas del cuadrado, hago un bucle que cambia las coordenadas para que se imprima cada vez más a la derecha y con cambio en el color (para trasladar una figura, se hace de otra forma mejor, pero ya llegará).

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Re: [Tutorial] II.2 - glutReshapeFunc()

Mensaje  ken310 el Vie Jul 16, 2010 3:37 am

Hola,entiendo todo el codigo,su estructura,las funciones,la setencia for,pero no entiendo como funcion glRectf()?Es que no cabe en la cabeza,como funciona pidiendo solo 4 puntos,en cambio al hacer por glBegin(GL_QUADS);
glVertex3f...

Pide tantos! Shocked

ken310

Cantidad de envíos : 4
Fecha de inscripción : 15/07/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: [Tutorial] II.2 - glutReshapeFunc()

Mensaje  HarZe el Jue Ago 12, 2010 12:26 am

ken310 escribió:Hola,entiendo todo el codigo,su estructura,las funciones,la setencia for,pero no entiendo como funcion glRectf()?Es que no cabe en la cabeza,como funciona pidiendo solo 4 puntos,en cambio al hacer por glBegin(GL_QUADS);
glVertex3f...

Pide tantos! Shocked

La función glRectf() dibuja un cuadrado sencillo en 2D. Los 4 argumentos son las coordenadas en dos dimensiones de la esquina inferior izquierda y de la esquina superior derecha.
Usar glBegin(GL_QUADS); es menos cómodo pero a la hora de ejecutar es más rápido.

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Re: [Tutorial] II.2 - glutReshapeFunc()

Mensaje  ken310 el Dom Oct 03, 2010 1:08 pm

Muchísimas gracias,harze.Yo es que empeze el insti,y aparte la programación,pero ahora que he decidido retornar!Recorde tu foro!Gracias por contestar!Ya te dire mis proximas dudas,no se como este foro tienen tan poca visitas,deberías comprar un dominio propio que valen 10euros all año,y asi podrias intentar ganar visitas,la gente no se fía de los foros con subdominio.


ken310

Cantidad de envíos : 4
Fecha de inscripción : 15/07/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: [Tutorial] II.2 - glutReshapeFunc()

Mensaje  Contenido patrocinado Hoy a las 5:22 pm


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.