[Tutorial] II.2 - glutReshapeFunc()
2 participantes
Página 1 de 1.
[Tutorial] II.2 - glutReshapeFunc()
II.2 El uso común de glutReshapeFunc():
Novedades:
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:
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:
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á).
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);
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á).
Re: [Tutorial] II.2 - glutReshapeFunc()
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!
glVertex3f...
Pide tantos!
ken310- Cantidad de envíos : 4
Fecha de inscripción : 15/07/2010
Re: [Tutorial] II.2 - glutReshapeFunc()
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!
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.
Re: [Tutorial] II.2 - glutReshapeFunc()
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
Temas similares
» [Tutorial] II.4 - glutKeyboardFunc()
» [Tutorial] II.5 - glutSpecialFunc()
» [Tutorial] II.6 - glutMouseFunc()
» [Tutorial C] IV.1 - Punteros
» [Tutorial C++] III.1 - Funciones
» [Tutorial] II.5 - glutSpecialFunc()
» [Tutorial] II.6 - glutMouseFunc()
» [Tutorial C] IV.1 - Punteros
» [Tutorial C++] III.1 - Funciones
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|