Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mis Comienzos Con Opengl

Iniciado por nsL, 12 de Mayo de 2005, 05:59:43 PM

« anterior - próximo »

Buffon

Cita de: "nsL"

void RenderScene()
{
   GLfloat tam = 0.5f;

glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
   glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix ();
glColor3f (1.0f, 1.0f, 0.0f);
glRotatef(30,1.0f,1.0f,1.0f);
glTranslatef(-0.5f,0.1f,1.0f);
// glTranslatef(0.0f,0.0f,0.0f);
glBegin (GL_LINES);
   glVertex3f (0.0f, 0.0f, 0.0f);  glVertex3f (tam, 0.0f, 0.0f);
      glVertex3f (tam, 0.0f, 0.0f);  glVertex3f (tam, tam, 0.0f);
   glVertex3f (tam, tam, 0.0f);  glVertex3f (0.0f, tam, 0.0f);
   glVertex3f (0.0f, tam, 0.0f);  glVertex3f (0.0f, 0.0f, 0.0f);
   glVertex3f (0.0f, 0.0f, 0.0f);  glVertex3f (0.0f, 0.0f, -tam);
   glVertex3f (tam, 0.0f, 0.0f);  glVertex3f (tam, 0.0f, -tam);
   glVertex3f (0.0f, tam, 0.0f);  glVertex3f (0.0f, tam, -tam);
   glVertex3f (tam, tam, 0.0f);  glVertex3f (tam, tam, -tam);
   glVertex3f (tam, tam, -tam);  glVertex3f (0.0f, tam, -tam);
   glVertex3f (0.0f, tam, -tam);  glVertex3f (0.0f, 0.0f, -tam);
   glVertex3f (0.0f, 0.0f, -tam);  glVertex3f (tam, 0.0f, -tam);
   glVertex3f (tam, 0.0f, -tam);  glVertex3f (tam, tam, -tam);
   glEnd ();
   glPopMatrix ();

Sistema.swapBuffers();
}

voy a analizar tu código de dibujado aunque comentarte que tu resize tiene un error muy gordo.

si te fijas bien, el glViewPort define la zona de proyección, esta función lo que hace internamente es calcular una matriz y multiplicarla en la pila actual, si la pila actual no es la projection sino que es la MODEL_VIEW podemos llegar a tener efectos bastante raros.

yo a fixPerspective lo llamo por que quizás me interesa en un momento determinado cambiar la camara de la escena.

lo primero que hacemos es crear el cubo, que tiene como vertices la variable tam (...) me gustaría saber el valor de esta variable

y cuando ya lo hemos dibujado nos transladamos -5 en el eje X, 1 en el eje Y y 1 en el eje Z

y una vez hemos hecho esto hacemos la rotación respecto al semieje positivo que tiene por vector director el (1,1,1). Con lo que conseguiremos que en algunos momentos se vea algo mejor el cubo y en otros desaparezca por completo seguramente.
-------------

nsL puedes poner el valor de la variable tam ?

PD:

sobre el gluPerspective que has puesto, ya está bien al principio dejarlo en near = 0.1f que así te quitas un montón de problemas.

nsL

 
Citar
nsL puedes poner el valor de la variable tam ?
tam = 0.5f ; la primera sentencia del renderscene() :P

Citar
si te fijas bien, el glViewPort define la zona de proyección, esta función lo que hace internamente es calcular una matriz y multiplicarla en la pila actual, si la pila actual no es la projection sino que es la MODEL_VIEW podemos llegar a tener efectos bastante raros.

Ya cambie mi changesize y lo puse asi:

void ChangeSize(int w, int h)
{
   if (h==0)  
   {
h=1;  
   }

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 
glViewport(0,0,w,h);

   gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,1.0f,100.0f);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();  
}


y sigue saliendo mal. Te pongo 2 screens pa que veas como me sale, que quizas no me estoy explicando bien y tamos hablando de cosas distintas :P

http://usuarios.lycos.es/rage182/cubo2.jpg
asi sale si hago la ventana cuadrada.
http://usuarios.lycos.es/rage182/cubo3.jpg
y asi si la estiro por algun lado :D

En fin, veras q he cambiado el cubo, pero eso no creo q importe pues es cosa de la ventana. y no hagas caso de lo de los fps :D

PD: ahora no me deja poner imagenes jpg en el foro ?
Yo no muero hasta la muerte -

nsL

 Pasando un poko de lo anterior q sino me quedo atascado....
¿Vosotros cuando pintais cualquier cosa (cubo, cilindro) os basais en un referencial propio de cada objeto no?
Es decir, por cada objeto guardais un referencial (posicion, eje x,y,z), del que creais una matriz q la multiplicais por la identidad para situaros en su posicion y luego pintar el objeto ¿no?

Es que algo he visto asi por ahi.  De hacerlo asi para transformar el objeto que habria q modificar directamente el referencial no?, es que tengo dudas sobre eso. Yo de momento, como ya visteis, voy haciendo transformaciones pintando y recuperando matrices, y asi sucesivamente.

Yo no muero hasta la muerte -

Lord Trancos 2

 Yo te recomiendo trabajar usando "camaras".

A efectos practicos una camara es una matriz que usaras en lugar de la matriz de identidad antes de transformar un objeto.

En otras palabras. En lugar de usar esto:


glPushMatrix
glLoadIdentity
glTranslate...
...
...
glPopMatrix

 
usar esto:


glPushMatrix
glLoadMatrix(MatrizCamara)
glTranslate
...
...
glPopMatrix


En mi "Escape from Avalon" lo que hice fue por cada objeto usar un vector con la posicion y una quaternion con la rotacion. Despues a la hora de dibujar, hacia algo asi:


glPushMatrix
MatrizObjeto = CalcularMatriz(VectorPosicion, QuatRotacion)
MatrizFinal = MultiplicarMatrices(MatrizCamara, MatrizObjeto)
glLoadMatrix(MatrizFinal)
...
...
glPopMatrix


Si eso cuando llegue a casa te pongo código "de verdad", que aqui no lo tengo a mano. :P
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

nsL

 
Citar
En mi "Escape from Avalon" lo que hice fue por cada objeto usar un vector con la posicion y una quaternion con la rotacion. Despues a la hora de dibujar, hacia algo asi:

glPushMatrix
MatrizObjeto = CalcularMatriz(VectorPosicion, QuatRotacion)
MatrizFinal = MultiplicarMatrices(MatrizCamara, MatrizObjeto)
glLoadMatrix(MatrizFinal)
...
...
glPopMatrix

a eso es lo q me referia, lo que pasa q yo en vez de quaternions (supongo q sera un angulo o algo asi) lo vi con 3 ejes del referencial (weno, de hecho 2, y calculaban el 3º con prod vect.).
Ahi esta donde tengo yo la duda. Despues de que hayas hecho eso de las matrices y la cargue con el loadmatrix lo dibujas simplemente ¿no?

Y si quieres rotar sobre si mismo el cubo por ejemplo, donde haces la rotacion, en el quaternion?, despues del loadmatrix?... esa es la duda q tengo yo :P.

Seguro q es una tonteria :P

PD: Me acabo de bajar el escape from avalon, jajajaj ta muy guapo tio, lo que pasa q es jodido pillar las cells esas sin comerte un asteroide :P

Yo no muero hasta la muerte -

Lord Trancos 2

 
Citar
lo que pasa q yo en vez de quaternions (supongo q sera un angulo o algo asi) lo vi con 3 ejes del referencia
Aprende a usar quaternions tan pronto como puedas... No hace falta que las comprendas, solo que sepas como usarlas. De lo contrario tendras problemas con el gimbal lock. (Haciendo el Escape from Avalon tuve problemas con el gimbal y otros problemas hasta que decidi usar quaternions)

Citar
Despues de que hayas hecho eso de las matrices y la cargue con el loadmatrix lo dibujas simplemente ¿no?

Claro. :-)

El glTranslate, glRotate y tal lo que hacen es aplicar modificaciones a la matriz actual, si simplemente ya tienes la matriz lista y la cargas con glLoadMatrix, solo te queda dibujar.

Citar
Y si quieres rotar sobre si mismo el cubo por ejemplo, donde haces la rotacion, en el quaternion?, despues del loadmatrix?... esa es la duda q tengo yo tongue.gif.

Erhh.... si quieres rotar un objeto sobre si mismo, primero le tienes que aplicar una rotacion y despues moverlo. Es decir, primero un glRotate y despues un glTranslate. (o al reves, la verdad es que ahora mismo no me acuerdo xDDD)

Citar
PD: Me acabo de bajar el escape from avalon, jajajaj ta muy guapo tio, lo que pasa q es jodido pillar las cells esas sin comerte un asteroide tongue.gif

Incluso en modo arcade? Pues mas facil no lo pienso hacer :P
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Ithaqua

Cita de: "Buffon"
voy a analizar tu código de dibujado aunque comentarte que tu resize tiene un error muy gordo.

si te fijas bien, el glViewPort define la zona de proyección, esta función lo que hace internamente es calcular una matriz y multiplicarla en la pila actual, si la pila actual no es la projection sino que es la MODEL_VIEW podemos llegar a tener efectos bastante raros.


glViewport no tiene nada que ver con la proyección, ni multiplica internamente una matriz. Lo único que hace es especificar un x, y, width, height con los cuales pasar de coordenadas normalizadas (las que ya están proyectadas) a coordenadas de pantalla. No hay ningún error ahí :)

nsL: para que no se te estire el contenido al modificar el tamaño de una ventana, debes dejar el aspect ratio (el 2º parámetro del gluPerspective) fijo. Lo normal es ponerle un aspecto equivalente a una pantalla 4:3, es decir 1.333f. No está de más tampoco que luego la típica ventana de setup te deje elegir entre diferentes aspectos (4:3, 5:4, 16:9...)
thaqua^Stravaganza
http://ithaqua.stravaganza.org

nsL

 jejejej, aunq ponga 1.333f se me estira igual
de momento para hacer pruebas e ir aprendiendo opengl me da igual, porq uso una ventana cuadrada y fuera, pero cuando quiera hacer algo para enseñar a la gente tendre q mirar bien donde esta el error, porq no se q puede ser  :blink:

Yo no muero hasta la muerte -

Buffon

Cita de: "Ithaqua"
Cita de: "Buffon"
voy a analizar tu código de dibujado aunque comentarte que tu resize tiene un error muy gordo.

si te fijas bien, el glViewPort define la zona de proyección, esta función lo que hace internamente es calcular una matriz y multiplicarla en la pila actual, si la pila actual no es la projection sino que es la MODEL_VIEW podemos llegar a tener efectos bastante raros.


glViewport no tiene nada que ver con la proyección, ni multiplica internamente una matriz. Lo único que hace es especificar un x, y, width, height con los cuales pasar de coordenadas normalizadas (las que ya están proyectadas) a coordenadas de pantalla. No hay ningún error ahí :)

nsL: para que no se te estire el contenido al modificar el tamaño de una ventana, debes dejar el aspect ratio (el 2º parámetro del gluPerspective) fijo. Lo normal es ponerle un aspecto equivalente a una pantalla 4:3, es decir 1.333f. No está de más tampoco que luego la típica ventana de setup te deje elegir entre diferentes aspectos (4:3, 5:4, 16:9...)
toda la razón del mundo, yo siempre lo entendí como definir un escalado y una translacción hacía la posición donde dibujar, por eso lo entendía como que calculase una matriz que aplicar a la de projección.

je todos los días se aprende algo ^^






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.