Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Entendiendo glPushMatrix y glPopMatrix

Iniciado por kittie4man, 25 de Septiembre de 2008, 05:07:04 PM

« anterior - próximo »

kittie4man

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

Pogacha

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 );


Pogacha

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

H-K

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.
"It's not who I am underneath, but what I do that defines me"

kittie4man

#4
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.

Pogacha

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.







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.