Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: nsL en 12 de Mayo de 2005, 05:59:43 PM

Título: Mis Comienzos Con Opengl
Publicado por: nsL en 12 de Mayo de 2005, 05:59:43 PM
 Weno, tras tener lios para conseguir crear un proyecto con ogl, que al final resulto ser una tonteria, ya me he puesto a mirar cosas. He intentado cargar un modelo MD5.... es broma ;), a ver, he hecho un cubo en amarillo y lo muestro girado. Os pongo el codigo:

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


Como veis, antes de dibujarlo hago un glTranslatef y tengo otro en comentario. Si lo ejecuto tal cual os lo puse me sale asi:
(http://usuarios.lycos.es/rage182/cubo.jpg)
y si pongo ese translate a comentario y dejo el otro, se me ve desde otra posicion (obviamente) pero entero, sin lineas cortadas. Y si pongo GL_POINTS en vez de GL_LINES hay puntos q no se me ven...

No se si el error esta ahi o cuando creo la ventana. Tengo una funcion changesize para cuando llame a WM_SIZE que la coji de internet, y puede que este mal. Sabeis porq puede ser?

Saludos y gracias!  B)

PD: Acabo de añadirle codigo pa que gire, y solo se me corta cuando pasa por esa altura. es como si se estuviese pintando encima algo negro des pues del cubo, pero solo pinto lo de la funcion que os puse  :blink:  
Título: Mis Comienzos Con Opengl
Publicado por: Ithaqua en 12 de Mayo de 2005, 06:31:41 PM
 Prueba a ponerle un gluPerspective(fov, aspect, near, far) de (60.0f, 1.33, 1.0f, 100.0f);  y el z del translate un pelín más (p.ej 2.0). Tiene pinta de que el cubo se "corta" por detrás con el far clipping plane.
Título: Mis Comienzos Con Opengl
Publicado por: Ithaqua en 12 de Mayo de 2005, 06:36:02 PM
 Ah, y si no tienes ningún gluperspective por ahí ya, tendrías que añadir el siguiente código:

Antes de glPushMatrix() (que imagino que tendrá activado el MODELVIEW):

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerpective(blabla);
glMatrixMode(GL_MODELVIEW);

y antes de glPopMatrix();

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 12 de Mayo de 2005, 06:48:24 PM
 Para el mensaje WM_SIZE estaba poniendo el modo ortogonal en vez de perspectiva :P, ya decia q no se veia muy cuadrado en algun giro. Y era lo que tu decias, el Z lo tenia mal y me estab pintandolo muy cerca, lo baje a 0.6f y ya se ve entero :P

Gracias!  B)  era obligatorio caer en este tipo de fallos de la que empiezas ;)
Título: Mis Comienzos Con Opengl
Publicado por: Lord Trancos 2 en 12 de Mayo de 2005, 08:22:40 PM
Cita de: "nsL"Gracias!  B)  era obligatorio caer en este tipo de fallos de la que empiezas ;)
Ciertamente ;)

Te recomiendo que aprendas bien como funciona el tema del z-buffer.
Habia algun post en estos foros donde se hablaba largo y tendido sobre el tema.
Título: Mis Comienzos Con Opengl
Publicado por: Lord Trancos 2 en 12 de Mayo de 2005, 08:25:34 PM
 Es este post al que me referia:
http://www.stratos-ad.com/forums/index.php...=14&t=3197&st=0
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 12 de Mayo de 2005, 09:25:59 PM
 Gracias ;), le toi echando un ojo.

Ahora el problema que tengo es que si pongo un tamaño de ventana 640x480 el cubo es las ancho que alto, como estirao. Supongo q el problema estara con lo de changesize , los viewport y eso, asi q tendre q mirarmelo mas a fondo :P
Título: Mis Comienzos Con Opengl
Publicado por: Lord Trancos 2 en 12 de Mayo de 2005, 10:04:24 PM
 Deberias de usar la funcion gluPerspective para definir el near, el far, el fov, y las dimensiones del viewport.
Si cambia el tamaño de la pantalla, cambia tambien el viewport.
Título: Mis Comienzos Con Opengl
Publicado por: Buffon en 12 de Mayo de 2005, 11:01:31 PM
 otra cosa que has de tener en cuenta es que cuando mandas a pintar la figura "glBegin(...)" los siguientes puntos que te encontrarás ahí adentro van a recoger las matrices en orden inverso a como las has escrito.

por ahí tienes que tener un fixPerspective() que te creará el Frustum y el tipo de camara y todo seguido estará el render.
------------------

por ejemplo si haces esto

fixPerspective();

glMatrixMode(GL_MODELVIEW); <---- modificamos la matriz de transformacion del modelo/escena
glPushMatrix() <--- esto es correcto, no se sabe si vas a necesitar la matriz anterior en un futuro

!!!! pero akí te ha faltado hacer glLoadIdentity();
si no haces ese glLoadIdentity() y la matriz la tenias modificada puede ser que el efecto deseado no sea el correcto!


glLoadIdentity();
-----------------------

ahora en este punto ya hemos definido la zona del mundo donde vamos a empezar a dibujar pongamos el ejemplo que queremos rotar el objeto 45º sobre su eje X y luego nos queremos poner a una distancia X para poder visualizar el objeto.

estos pasos son muy importantes realizarlos bien, primero por que el objeto tiene que representarse bien en la pantalla y para esto se ha tenido que definir bien varios datos:

Znear == distancia a partir del observador que se empezará a dibujar la geometria.
Zfar == distancia a partir del observador que se dejará de dibujar la geometria.

...................................................znear .........................................................................zfar
observador__________________[ SE DIBUJA LA GEOMETRIA QUE CAE AQUI ADENTRO]
--------------------------------

que más valores faltan por definir bien?

fov == es el angulo de obertura de nuestra camara en coordenadas Y
aspect ratio == es la relación de aspecto de nuestro viewport, por ejemlo si defines un ancho y un alto, pues la relación de aspecto es ancho/alto pero no tienes que pasarle a tu programa ese ancho y ese alto, simplemente la relación de aspecto del mismo.

con estos cuatros valores defines el volumen de visión de tu geometria:

gluPerspective(fov,aspect,Znear,Zfar); <--- y esto se hace con la matriz de projeccion, ya que definimos el volumen de la misma.

ahora entenderás que si tu haces un glTranslatef de una distancia X por ejemplo 10 sobre el eje -Z y tu znear es 20, pues toda la geometria que está desde 10 a 20 no se dibujará y el objeto se verá cortado por la parte delantera.

En cambio si te transaldas 10 y tu Zfar es 5, cortarás todo el modelo que hay después de esta distancia, con lo cuál sólo verás las partes del objeto que están a una distancia menor o igual a 5 desde el punto de donde estás mirando.
----------------------------------

Pregunta que te harás, entonces para que me sirve el ancho y el alto?

correcto ^^ también hay que definir sobre que parte de la ventana estás pintando, y eso también hay que definirlo en la matriz de projección.

en que sentido? vamos a ver como quedaría nuestra función fixPerspective()

[START]fixPerspective

glMatrixMode(GL_PROJECTION); <--- definimos nuestra matriz de projeccion
glLoadIdentity(); <--- nos cargamos nuestra matriz actual y cargamos la matriz identidad

glViewPort(0,0,ancho,alto);    <----- definimos sobre que parte de la ventana vamos a dibujar

gluPerspective(fov , aspect , znear , zfar); <---- definimos el volumen que se pintará sobre la pantalla.

glMatrixMode(GL_MODELVIEW); <---- modificamos el modo para no cagarla en cualquier punto de nuestro programa.

ENDfixPerspective();

cabe decir que todas estas variables hay que tenerlas como globales a la función, el znear y zfar podemos necesitar modificarlos en algún momento determinado, lo mismo que el fov que sirve para hacer zooms ;)


---------------------------

cuando ya hemos definido nuestro volumen de projeccion es hora de empezar con el modelado.

[START]dibujarEscena()

en este momento sabemos que tenemos la matris de MODELO (MODELVIEW)
pues vamos a pensar que nos interesará hacer con nuestro modelo.

PASO1
hemos definido nuestro znear a una distancia X y nuestro zfar a una distancia 3X
pues vamos manos a la obra ^^

------------------------X------------------------2X------------------------3X

este diagrama indica que nuestro modelo ha de caer entre X y 3X para poderlo visualizar.

punto número 1 realizado.

PASO2
que modificaciones sobre nuestro modelo tenemos que realizar?

pues quiero dibujar el modelo, hacerle una rotación de 40º sobre su eje X
una vez hecho esto quiero realizarle una nueva rotacion de 30º pero sobre su eje Y

pues ya lo tenemos todo preparado no?

-mandamos a pintar la geometria
-rotamos 40º en eje X  (no nos hemos movido)
-rotamos 30º en eje Y  (no nos hemos movido)
-nos desplazamos hasta la posicion del observador. (2X en el eje -Z)

[START]dibujarEscena()

//aqui tenemos definida la matriz MODELVIEW para dibujar
glPushMatrix() :no nos queremos cargar la matrix anterior por si acaso.
glLoadIdentity() :definimos que la matriz actual es la Identidad --- no realiza cambios sobre el objeto

glTranslatef(0, 0, -2X); //ahora estamos situados sobre el observador

glRotatef(30, 0, 1, 0); //hemos hecho un giro de 30º en el eje Y
glRotatef(40, 1, 0, 0); //hemos hecho un giro de 40º sobre el eje X

<<<<<< Aqui dibujamos nuestra geometria.

[END]dibujarEscena
--------------------------------------------------

como se observa en dibujarEscena todos los pasos que hemos pensado los tenemos que escribir al revés antes de enviar la geometria a pintar, ya que OpenGL multiplica las matrices de Derecha a Izquierda, con matrices no hay commutatividad.

translacion * rotacionY * rotacionX * vertice

y este esquema se aplica para cada vertice que se envia a dibujar, por eso hay que escribirlo así ^^.

<----------------------------------------------->

Espero que este minitutorial haya servido para algo ^^ y haya aclarado a nsL un poquito más como hay que definir la camara antes de hacer nada y tener claro los valores que tenemos.

Comenzar en OpenGL es más facil para mi entender que en DirectX, pero vaya si es complicado de todas maneras  :lol:



(!)  (!)  (!)  (!)  (!)
fe de erratas y por eso lo Edito.

glViewPort no define dos puntos inicio origen, sino que define punto inicio y luego el ancho y el alto de nuestra zona para pintar, que me parece que antes lo puse mal
Título: Mis Comienzos Con Opengl
Publicado por: Buffon en 12 de Mayo de 2005, 11:09:21 PM
Cita de: "Lord Trancos 2"Deberias de usar la funcion gluPerspective para definir el near, el far, el fov, y las dimensiones del viewport.
Si cambia el tamaño de la pantalla, cambia tambien el viewport.
el gluPerspective no cambia las dimensiones del viewport, esto se realiza con la llamada a la función

glViewPort(origenX, origenY, finalX, finalY);

esto define un rectangulo sobre el que se va a dibujar cualquier geometría que se mande a pintar, a no ser que se defina otro viewport después.

-----------------------------

y ahí está la gracia :o se puede conseguir un efecto 3DStudio con estas llamadas.

[START]dibujarEscena()

1)  llamamos a fixPerspective1() <-- esta la unica diferencia que tiene es la llamada a glViewPort(0,0,width/2,heigth/2);

simulados nuestra llamada enterio a dibujarEscena();

2) ahora llamamos a fixPerspective2() <-- esta hace glViewPort(width/2, 0, width/2, heigth/2);

y volvemos a simular la llamada a dibujarEscena();

y esto lo hacemos 4 veces dividiendo nuestra pantalla en 4 zonas "independientes" ^^.

esto de independiente hay que mirarlo con lupa, ya que habria que tener en cuenta la zona de la pantalla donde ha hecho click el raton por ejemplo para realizarlo correctamente.
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 16 de Mayo de 2005, 01:11:58 PM
 Perdon por no contestar, es que tuve que ir pa asturias todo el finde q acabo de ser hermano por segunda vez y taba liao. Le echo un ojo a esto q me pones y ya te comento.

Gracias ;)
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 16 de Mayo de 2005, 04:19:27 PM
 Ya lo lei  (un poco rapido q tengo prisa ufff :P)

Yo lo que estaba haciendo era establecer la perspectiva al crear la ventana cuando me llegase el mensaje de WM_SIZE, pero luego en cada render no establecia nada :D Por otro lado ya me quedaron bastante claros los conceptos. ahora toka hacer mas pruebas, que llevar con pinzas estas cosas no es buen camino ;)

Esta semana qu creo q tengo mas tiempo enredare bastante y ya te comento como me fue. Gracias por la ayuda ;)
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 18 de Mayo de 2005, 04:54:33 PM
 A ver, ya he probado lo que me has dicho, pero sigue igual la cosa.
Lo que tu llamas fixperspective(); se llama en mi caso changesize y es esta:

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

   glViewport(0,0,w,h);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();  

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

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();  
}


El problema es q no ve donde la llamas tu. Yo hasta ahora la llamaba en WM_SIZE, pero tb probe en WM_CREATE y tb justo antes de mi RenderScene(); (en este ultimo caso se me queda en negro todo).

Donde hay q llamarla? :P

Gracias y Saludos!  B)
Título: Mis Comienzos Con Opengl
Publicado por: ajmendoza en 18 de Mayo de 2005, 05:48:06 PM
 gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);

Por qué a 0.1? Prueba con 1. (no he leido todo lo que te pasa, solo que he visto eso y me ha resultado raro)

Un saludo
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 18 de Mayo de 2005, 06:18:12 PM
 si, weno es que haciendo cambios al final se me paso y me quedo asi :P, pero vamos, q el problema no debe ir con eso ;)
Título: Mis Comienzos Con Opengl
Publicado por: Buffon en 19 de Mayo de 2005, 12:58:56 AM
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.
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 19 de Mayo de 2005, 01:36:03 AM
 
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 ?
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 19 de Mayo de 2005, 11:30:25 AM
 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.

Título: Mis Comienzos Con Opengl
Publicado por: Lord Trancos 2 en 19 de Mayo de 2005, 12:13:12 PM
 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
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 19 de Mayo de 2005, 02:49:04 PM
 
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

Título: Mis Comienzos Con Opengl
Publicado por: Lord Trancos 2 en 19 de Mayo de 2005, 04:18:06 PM
 
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
Título: Mis Comienzos Con Opengl
Publicado por: Ithaqua en 19 de Mayo de 2005, 05:23:57 PM
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...)
Título: Mis Comienzos Con Opengl
Publicado por: nsL en 19 de Mayo de 2005, 05:49:06 PM
 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:

Título: Mis Comienzos Con Opengl
Publicado por: Buffon en 19 de Mayo de 2005, 08:44:45 PM
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 ^^