Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: kittie4man en 25 de Septiembre de 2008, 05:07:04 PM

Título: Entendiendo glPushMatrix y glPopMatrix
Publicado por: kittie4man en 25 de Septiembre de 2008, 05:07:04 PM
Hola a todos!!

Voy directo al grano:
En mi proyecto tengo una clase que pinta unos tanques así:
Código (cpp) [Seleccionar]
glPushMatrix();
glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);

glBindTexture( GL_TEXTURE_2D, _tGunCanon );

glTranslatef( _x, _y, 0.0);

glRotatef( _angleView, 0.0, 0.0, 1.0 );

//glScalef(1.0,1.0,1.0);

glPolygonMode(GL_FRONT, GL_FILL);
glBegin(GL_QUADS);
glTexCoord2f(1.0, 1.0); glVertex3f( -(_width+1.0),   _heigth,  0.0 );// Top Left Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f( -(_width+1.0), -(_heigth), 0.0 );// Bottom Left Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f(   _width,    -(_heigth), 0.0 );// Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 1.0); glVertex3f(   _width,  _heigth,  0.0 );// Top Right Of The Texture and Quad
glEnd();
glDisable( GL_TEXTURE_2D );
glDisable( GL_BLEND );
glPopMatrix();


Ahora, en el bucle principal del juego, en determinado momento, pinto un circulo y un cuadrado (ambos sin relleno) de esta manera:
Código (cpp) [Seleccionar]
GLfloat x=0.0, y=0.0, z=0.0;

glPushMatrix();
glTranslatef( px, py, 0.0 );
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINE_STRIP);
glVertex3f( px-5, py-8, 0.0 );// Top Left Of The Texture and Quad
glVertex3f( px-5, py+8, 0.0 );// Bottom Left Of The Texture and Quad
glVertex3f( px+5, py+8, 0.0 );// Bottom Right Of The Texture and Quad
glVertex3f( px+5, py-8, 0.0 );// Top Right Of The Texture and Quad
glVertex3f( px-5, py-8, 0.0 );// Top Left Of The Texture and Quad
glEnd();
glPopMatrix();

glPushMatrix();
glTranslatef( px, py, 0.0 );
glColor3f(0.5, 0.5, 1.0);
glBegin(GL_LINE_STRIP);
for (int angle = 0 ; angle < 180 ; ++angle)
{
x = radio * sin(angle);
y = radio * cos(angle);
glVertex3f( x , y, z);
}
glEnd();
glPopMatrix();


El render completo despues de pintar TODOS los objetos, lo hago así:
Código (cpp) [Seleccionar]
SDL_GL_SwapBuffers();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();


El tema es el siguiente.
1.- Al usar color para pintar estos objetos se me colorean el resto de los objetos que sean pintados después.
2.- En ese metodo tengo 2 objetos creados con sus propias translaciones. La translacion del ultimo objeto (el circulo) creado se realiza y la primera (el cuadrado) no se hace. La translacion es la misma en ambos casos.
3.- Esa es la mejor forma de crear una circulo sin relleno? Esto viene a que NO se ve como quiero, parece como que tuviera un borde ancho y con irregularidades, si no se entiendo pongo una captura para que lo vean.

Mi pregunta es si tengo que poner un glColor3f(1.0, 1.0, 1.0); obligatoriamente al final de este metodo para que no pinte el resto de los objetos renderizados o hay algo mal en la implementacion de glPushMatrix, glPopMatrix o glLoadIdentity??

Espero que alguien pueda ayudarme.

Desde ya muchas gracias.

Salu2
Juan Pablo desde Argentina
Título: Re: Entendiendo glPushMatrix y glPopMatrix
Publicado por: Pogacha en 25 de Septiembre de 2008, 05:21:49 PM
Hola ... tuve que mirar dos veces para ver si no era yo ...
al margen ...

1 -
Para el color tienes que usar:
http://www.cs.rutgers.edu/~decarlo/428/gl_man/pushattrib.html
(Como metodo teorico para no alterar lo que estabas haciendo antes)

Aun que creo que mejor practica es resetear lo que cambiaste en realidad.
Si un glColor4f(1,1,1,1);

2 - todavia no encontre el fallo

3 - Es que sin y cos aceptan solo radianes y no grados segentexigeximales y con 180 no das toda la vuelta, tiene que ser 360 y tienes que volver al punto inicial para cerrar el circulo (parece hasta filosofico) o sea <= en ves de <

.... angle<=360; angle++)
... sin( (float)angle / 360.0f * 2.0f * M_Pi );
... cos(  (float)angle / 360.0f * 2.0f * M_Pi );

Título: Re: Entendiendo glPushMatrix y glPopMatrix
Publicado por: Pogacha en 25 de Septiembre de 2008, 05:25:51 PM
2 - Estas haciendo una doble traslacion,

   glTranslatef( px, py, 0.0 );  // aqui ya lo moviste.

saca los px y py del glVertex3f
   glVertex3f( -5, -8, 0.0 );// Top Left Of The Texture and Quad
   glVertex3f( -5, +8, 0.0 );// Bottom Left Of The Texture and Quad
   glVertex3f( +5, +8, 0.0 );// Bottom Right Of The Texture and Quad
   glVertex3f( +5, -8, 0.0 );// Top Right Of The Texture and Quad
   glVertex3f( -5, -8, 0.0 );// Top Left Of The Texture and Quad
Título: Re: Entendiendo glPushMatrix y glPopMatrix
Publicado por: H-K en 25 de Septiembre de 2008, 05:30:38 PM
Se me ha adelantado Pogacha...
"Advertencia - mientras estabas leyendo, fueron publicadas 2 respuestas. Probablemente desees revisar tu mensaje."  8o

Qué feature más cuca, oiga.
Título: Re: Entendiendo glPushMatrix y glPopMatrix
Publicado por: kittie4man en 25 de Septiembre de 2008, 06:14:04 PM
Muchas gracias a ambos.

Voy a probar lo que me dijeron y ya les comentare.

Nuevamente muchas gracias por la pronta ayuda.

Lo que me gustaría saber es que función cumplen el glPushMatrix y glPopMatrix ya que según tenia entendido, todo lo que se hiciera entre ellos no afectaría a nada del resto.
Porque ocurre eso de que dentro de glPushMatrix y glPopMatrix pinto un objeto de x color y el resto de los objetos que pinte (de ahi en adelante, fuera de push y pop) se pintaran del mismo color?
Que sentido tiene poner glPushMatrix y glPopMatrix entonces?

Mas allá de que este solucionado lo del circulo, el translate y el color, me gustaría entender un poco como funcionan y para que sirven exactamente glPushMatrix y glPopMatrix.
Eh buscado pero no encontré una definición que entienda 100%.

Salu2
Juan Pablo desde Argentina

EDIT:
Anda TODO de maravilla, muchas gracias por todo.
Título: Re: Entendiendo glPushMatrix y glPopMatrix
Publicado por: Pogacha en 25 de Septiembre de 2008, 10:18:27 PM
Busca lo que es una matriz, y como se usa para definir rotaciones, translaciones, escalamientos y transformaciones lineales de un espacio.
Luego veras que OpenGL y DirectX usan matrices para definir transformaciones.

Al hacer pushmatrix estas poniendo en una pila la matrix, y luego la puedes rescatar tal como estaba.
pushattrib sirve para guarda otros estados, el color actual, el blending u otras cosas.
Con hacer pushmatrix tan solo te salvas de los cambios que le hagas a esa matriz.

Saludos.