Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Primer Programa En Opengl: Problemas De Medida

Iniciado por LudwigVan, 24 de Diciembre de 2004, 12:54:38 PM

« anterior - próximo »

LudwigVan

 Hola a todos

Acabo de empezar con las 3D y ando un poco perdido. He leido el primer capitulo del tutorial de nehe y lo he simplificado un poco quedandome esto:


 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
 

 glMatrixMode(GL_PROJECTION)
 glLoadIdentity()

 glMatrixMode(GL_MODELVIEW)
 glLoadIdentity()


 glTranslatef(0,0.5,0)  
       
 glBegin(GL_TRIANGLES);    
 glVertex2f( 0, 0.3)    
 glVertex2f(-0.3,-0.3)  
 glVertex2f(0.3,-0.3)    
 glEnd()                              
         
 glTranslatef(0,-0.8,0.0)

 glBegin(GL_QUADS);      
 glVertex3f(-0.3, 0.3, 0.0)    
 glVertex3f( 0.3, 0.3, 0.0)    
 glVertex3f( 0.3,-0.3, 0.0)    
 glVertex3f(-0.3,-0.3, 0.0)    
 glEnd()  


Bueno me dibuja el triangulo y el cuadrado pero tengo bastantes dudas.

¿Porque decimales? Es decir, tengo un cuadrado de 0.6 unidades y me ocupa alomejor un 20% de la pantalla asi que supongo que la pantalla o al menos para esto de las primitivas es de 1x1 ¿?

Como me oriento para poner cosas por la pantalla?, en 2d por ejemplo tenia la referencia clara de los pixeles.

He probado a jugar con el valor Z de glTransfer pero en cuanto cambio los valores se me salen las figuaras (creo, al menos no veo nada)  del campo de vision.

Saludos.

P.D. Sabeis de algun tutorial, web... que hable de estos temas basicos de la representacion en 3d de forma general, es decir, la teoria, sin codigo.


ethernet

 Ten cuidado porque estás poniendo la matriz de proyección a la identidad:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()

Seguro que nehe no hace eso, revisa el código ya verás como usa un gluPerspective en algun aparte

Te aconsejo que te bajes el redbook que está en pdf por internet y que te mires en internet tutoriales básicos que normalmente suelen explicar cosas básicas de la geometría necesaria.

un saludo, suerte

Pogacha

 Ya que estas trabajando en 2d yo te recomendearia que eches un ojo a glOrtho
Como ayuda:
Ogl trabaja con dos matrices.
ModelView que sirve para indicar como se transformara el modelo que pasas con glVertex en el espacio, permite escalar, desplazar y rotar. Esto te permite por ejemplo ver el objeto desde muchos puntos de vista o por ejemplo con un solo modelo duplicarlo varias veces en el espacio sin tener que modificar los valores que le paso a glVertex.
Porjection que indica la transformacion que tendra el modelo transformado para proyectarse en pantalla. ha dos formas basicas Perspectiva y Ortonormal, estas se definen seteando esta matriz, generalmente la matematica envuelta es media complicada y se utilizan funciones auxiliares, si no me equivoco :
gluPerspective
glOrtho
y con unos parametros sencillo logras decirle lo que tu quieres.

Red book ira bien junto con el los tuts de nehe.  (ole)
Saludos.

ALRAZ

 Pregunta: qué tan inteligente es usar Open GL con SDL?
aunque sea sólo para aprender

ethernet

Cita de: "ALRAZ"Pregunta: qué tan inteligente es usar Open GL con SDL?
aunque sea sólo para aprender
Creo que usar SDL o GLUT para empezar con Opengl es una buenísima idea porque te abstraes y simplificas aspectos específicos del SO que de otra manera entorpecerían el aprendizaje de lo que realmente quieres aprender (que es opengl claro :)


senior wapo

 
Cita de: "LudwigVan"¿Porque decimales? Es decir, tengo un cuadrado de 0.6 unidades y me ocupa alomejor un 20% de la pantalla asi que supongo que la pantalla o al menos para esto de las primitivas es de 1x1 ¿?

Como me oriento para poner cosas por la pantalla?, en 2d por ejemplo tenia la referencia clara de los pixeles.
Intentaré no usar palabrejas raras y que sea sencillito, lo prometo  (twist)

En 3D la referencia es la coordenada Z (o lo que uses de profundidad) y la amplitud de tu campo de visión. Mira a tu alrededor, si te colocas un libro 1 metro a tu derecha no lo ves. pero si retrocedes un par de metros, lo ves aparecer en tu campo de vision, ¿verdad?

Para convertir de pixeles a coordenadas 3D:

Cuando Z=1, el primer pixel por la izquierda es la coordenada x=-1, y el pixel más a la derecha x=1 (ancho de pantalla=2). Si dibujas el objeto más lejos, por ejemplo a profundidad z=5, entonces el pixel más a la izquierda es x=-5 y el más a la derecha x=5.  Básicamente, si ignoramos el factor de corrección,  el ancho de las coordenadas se multiplica por Z.

¿ Y el factor de correción de que depende ?
Pues de la amplitud de tu campo de visión. Se le llama FOV (Field of View) y en los humanos oscila entre 45 y 60 grados a cada lado. Yo uso 90 grados de FOV (45+45),  Blizt3D usa 90 grados, ID software usa 90 grados (desde el viejo wolf3D hasta DOOM3), Irrlicht engine usaba 45 (o 60, lo cambiaron hace poco). 90 grados tiene unas propiedades matemáticas muy ventajosas, aunque ese es otro tema de post.

Hablo de 90 grados horizontalmente (derecha a izquierda). La pantalla es mas ancha que alta, asi que poner el mismo FOV verticalmente comprimirá las imagenes verticalmente y aparecerá todo achatado, para que quepa el mismo angulo en menos pixeles. Lo solucionas con un FOV menor verticalmente.

En OpenGL el FOV lo ajustas con la función glFrustum. Estrictamente, lo que ajustas son los planos de corte ("clipping planes"), pero viene a ser lo mismo.

Olvidate de gluPerspective, si usas FOV  90 grados, simplemente inserta estas líneas de código justo antes del primer glTranslate (justo debajo de donde ajustas las matrices de modelo y proyección):


  float zNear = 3.0f;
  float fov_value_x = zNear  * 1.0f;   // FOV 90 = 1.0 =  tan( 90.0 * M_PI / 360.0);
  float aspect_ratio_y = (GLfloat)alto_pantalla/(GLfloat)ancho_pantalla;
  aspect_ratio_y *= fov_value_x;

  glFrustum( -fov_value_x, fov_value_x, -aspect_ratio_y, aspect_ratio_y, zNear, 8192.0f );

Si usas un campo de visión distinto pues usas la formula del comentario de fov_value_x

3.0 y 8192 son la coordenada mínima y máxima de profundidad que planeas poder visualizar. Cuanto más restringidas (menos amplio), más precisión tendrás en el bufferZ y menos errores aparecerán al dibujar dos superficies casi superpuestas (casi misma Z). Si no lo entiendes, déjalo como está.

Si te he liado demasiado (seguro que si) dime donde te tengo que aclarar algo  :D

StraT

 A mi me ha venido de perlas la explicacion.

Sobre usar opengl sobre sdl, es cojonudo, te olvidas de muchas cosas y te centras en aprender opengl que al fin y al cabo es lo que te interesa en estos estadios de tu aprendizaje.

Saludos
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

senior wapo

 Una errata:

para la tangente se usa la mitad del angulo, asi que no es tan (90) sino tan(45):

// FOV 90 = 1.0 =  tan( 45.0 * M_PI / 360.0);

Aparte de que la tangente de 90 es infinito, si usaras 90 tendrias un FOV de 180 grados (90 a cada lado). No afecta al código, solo al comentario por si quieres usar otro ángulo.

shephiroth

 Wenas.

Cuando empecé con ogl siempre me hice la misma pregunta pero acabe usando el glOrtho. Muy bueno el post :)

Solo un par de cosillas:
1) Ese M_PI a que se refiere??
2) Podrías explicar un poco mas lo de la profundidad maxima y mínima??? No termino de pillarlo >_<


GRACIAS

ALRAZ

 Aprovechando el topic, hago una preguntilla:

Me puse a leer esos tutoriales de NeHe y estoy "adaptando" algo de código SDL para que use OpenGL (Por eso la pregunta de hace unos posts).
Sólo que tengo un problemilla:

A la hora de poner texturas, me no pone los colores como debiera... los azules se ven rojos, los rojos se ven verdes... etc .  :(
Las texturas las cargo con SDL_Image, pero también intenté con SDL_LoadBMP y pasa lo mismo.

Pongo el código:


unsigned int texture;
SDL_Surface *Tes;

  Tes = IMG_Load ("chivo.bmp");

  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);

  SDL_LockSurface (Tes);

  glTexImage2D(GL_TEXTURE_2D, 0, Tes->format->BytesPerPixel, Tes->w, Tes->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, Tes->pixels);

  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

  SDL_UnlockSurface (Tes);
  SDL_FreeSurface (Tes);


el archivo es un BMP de 128x128 a 32 BPP
lo intenté también con 24 BPP y GL_RGB
pero no pasa naa  :angry:

Será que tengo que lidiar con el pitch de las SDL_Surface?

shephiroth

 Wenas

No entiendo mucho de SDL, pero creo que se cual es el problema que tienes. Yo utilizo tga en vez de bmps, asi que no estoy del todo seguro. Pille la funcion de los ejemplos de nehe, pues admite tga comprimido y sin comprimir, pillando transparencias, lo que me ahorra codigo.......pues bien, en la funcion de cargar la imagen, va recorriendo lo que son los bytes de imagen y les va dando la vuelta........es decir, tenemos RGB pero en el archivo esta BGR, por lo que una vez cargado el archivo y antes de pasarselo a ogl para que cree la textura tengamos que hacerlo.....

P.D: Otra posibilidad (derivado de lo mismo) es que las funciones que uses hagan este proceso varias veces, por lo que la primera lo ponga en orden correcto, y la segunda lo ponga mal........solucion, hacerlo una tercera vez xDD)

SALUDOS ^^

ALRAZ

 Rewenas  :D

lo he probado con un PNG y funcionó perfectamente
estúpidos bitmaps >_<

gracias por el tip

ALRAZ

 requetewenas  :P  He vuelto!

más problemillas con OGL  :(

siguiendo con los tontoriales de nehe, felizmente encontré uno que me "enseñaba" a cargar bitmaps y mostrarlos con "silueta" y toda la cosa  (genial) ; como si tuvieran Color key.
el problema es que también la imagen se me hace transparente  :angry:
y la verdad en el código no explican muy bien como rayos se debe hacer para mostrar un bitmap con todos sus colores menos el que queremos borrar  (nooo) .

En el tutorial muestran como eliminar un fondo negro de un fondo negro; sii bien es cierto que es un progreso, los pixeles del bitmap también se hacen 50% transparentes (o algo parecido, el caso es que se ve a través de ellos), cosa que no siempre querremos.

La idea es mostrar sprites 2D  (por ejemplo: personajes en 2D y escenarios en 3D)

sugerencias?

BeRSeRKeR

 
Cita de: "shephiroth"1) Ese M_PI a que se refiere??
Es el número PI, o sea, 3.1415926535897932384626433832795. Lo que está haciendo es pasar el ángulo (45º) a radianes que es lo que necesita la función tan.
Cita de: "shephiroth"2) Podrías explicar un poco mas lo de la profundidad maxima y mínima??? No termino de pillarlo >_<
Quiere decir que cuanto mayor sea la diferencia entre el near plane y el far plane, más precisión perderás y por lo tanto más posibilidades existirán de producirse z-fighting, es decir, el solapamiento de polígonos...un polígono se ve delante de otro cuando en realidad debería de ser al revés.

Te pongo un ejemplo por si te sirve de algo:

imagina que tenemos los siguientes valores para el near y far plane

NearPlane = 0
FarPlane = 100

ahora piensa que en clip space (en Direct3D), la coordenada Z se encuentra en el rango [0,1]. Eso quiere decir que teniendo los valores anteriores, una Z de 50 equivaldría en clip-space a 0.5 (50/100). Bien, ahora mira lo que ocurre con estos otros valores:

NearPlane = 0
FarPlane = 10000

si seguimos en el caso de que Z tenga un valor de 50, tenemos que en clip-space Z sería 0.005 (50/10000).

Ahora piensa en dos polígonos que estan muy cerca el uno del otro. Uno tiene una Z de 50.01 y el otro de 50.02. En el caso del near-far plane de [0, 100], su Z en clip-space tendría un valor de 0.5001 y 0.5002 respectivamente mientras que en el caso de near-far plane de [0, 10000] lo valores serían 0.005001 y 0.005009 respectivamente. Como puedes ver, en el primer caso dificilmente se producirá z-fighting pero en el segundo podría producirse debido a la pérdida de precisión.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.