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 »

nsL

 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:

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:  
Yo no muero hasta la muerte -

Ithaqua

 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.
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Ithaqua

 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);
thaqua^Stravaganza
http://ithaqua.stravaganza.org

nsL

 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 ;)
Yo no muero hasta la muerte -

Lord Trancos 2

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.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Lord Trancos 2

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

 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
Yo no muero hasta la muerte -

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.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Buffon

 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

Buffon

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.

nsL

 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 ;)
Yo no muero hasta la muerte -

nsL

 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 ;)
Yo no muero hasta la muerte -

nsL

 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)
Yo no muero hasta la muerte -

ajmendoza

 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

nsL

 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 ;)
Yo no muero hasta la muerte -






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.