Hola, primero agradecer a todos por este gran sitio, un foro de programacion grafica en español siempre es super util, GRACIAS.
Tengo otra duda si me puedeen ayudar porfavor.
Los screenshots estan con comentarios en ingles ,era un post que deje en gamedev, pero es super entendible:
mi problema es el siguiente, cuando me acerco a una figura me pasa que el near plane corta a esta pero lo hace,segun yo, demasiado lejos de la pantalla deberia cortar la figura mas cerca ya que lo tengo setado en 1(el near plane).
Me dieron como consejo que lo disminuyera(el near plane) pero como lo voy a disminuir mas si ya esta en 1.0 y si lo bajo la perspectiva se desfigura?
aki estan las figuras
los comentarios dicen:"puedo evitar esto" "para que se vea asi"
http://img514.imageshack.us/img514/1188/82402901wj3.jpg
Bueno esa es una pregunta tengo otra:
parecera raro pero alguien me puede decir cual es la escala que se usa en opengl en los juegos. Me explico: cuando juego, por ejemplo quake2, de que tamaño es el personaje que veo es acaso de 100 altura? de 10?
de 1?????. con que tamaño se trabaja generalmente.
Planeo usar modelos 3d pero no que cual es el tamaño adecuado para una persona?
de antemano muchas gracias.
by..tes....
0.1?
0.01?
Las unidades son las que tu quieras. Yo uso las del doom1 original (el de 1993) que son aproximadamente 32 unidades = 1 metro, 1 unidad=3 cm.
Lo bueno que tiene es que puedo representar puntos y distancias con enteros en vez de floats con bastante precisión (3 cm).
Lo de que te recorte los poligonos solo lo evitas colocando los objetos más lejos, me temo.
tamat no te entendi.
Me quieres deecir que si puedo decrecentar mas de 1.0 a 0.1 o a 0.01?
eso me dices verdad?
lo que pasa es que si le pongo 0.1 por ejmeplo la perspectiva se me deforma totalmente.
Si has juagado un shooter por ejemplo quake2, si pones el comando fov 180 por ejemplo, es comparable a ponerle 0.1 a near plane.
gracias por responder
GRACIAS senior wapo
asi que 32uni=1 metro chaaaaa!!! yo creia que hacer algo de 20 ya era gigantesco :D .
Ok, me quedo entonces con esa escala.
gracias
Algo no me cuadra, yo uso near de 0.01 y se ve de puta madre, el near no afecta a la proyeccion, afecta al culling cuando hace render y a la precision en el ZBuffer, pero no a la proyección. Puedes hacer la prueba en cualquier programa 3D.
Cita de: "tamat"Algo no me cuadra, yo uso near de 0.01 y se ve de puta madre, el near no afecta a la proyeccion, afecta al culling cuando hace render y a la precision en el ZBuffer, pero no a la proyección. Puedes hacer la prueba en cualquier programa 3D.
precisamente se deforma por la precisión del Zbuffer.
yo siempre he tocao el near plane sin problemas para acercarlo bastante a la camara...
para mi 10 unidades = 1 metro. Tampoco me informé mucho antes de usar otra escala.
Cita de: "Buffon"Cita de: "tamat"Algo no me cuadra, yo uso near de 0.01 y se ve de puta madre, el near no afecta a la proyeccion, afecta al culling cuando hace render y a la precision en el ZBuffer, pero no a la proyección. Puedes hacer la prueba en cualquier programa 3D.
precisamente se deforma por la precisión del Zbuffer.
No, perder precision en el zbuffer lo que produce son artefactos cuando dos planos estan muy cercanos (el clasico parpadeo entre dos poligonos en la lejania). Pero la proyeccion sigue siendo exactamente la misma.
Tener el near plane cercano es malo porque puedes desbordar la precisión en bits de un float en poligonos largos y perpendiculares a la cámara y otros casos. Me refiero durante las transformaciones y el cliping, que se acumulan resultados de multiplicaciones y demás antes de almacenar el resultado final.
En general es bueno que sea mayor o igual a 1, y no hace daño que sea de 3, como usa el editor del quake. Yo pongo 1 o 3 según me da ese día.
Con doubles no hay problema pero los APIs suelen usar floats. De todas formas normalmente no te va a dar problemas y la gente ya está acostumbrada a que las cosas demasiado cercanas no se vean bien.
Cita de: "tamat"Cita de: "Buffon"Cita de: "tamat"Algo no me cuadra, yo uso near de 0.01 y se ve de puta madre, el near no afecta a la proyeccion, afecta al culling cuando hace render y a la precision en el ZBuffer, pero no a la proyección. Puedes hacer la prueba en cualquier programa 3D.
precisamente se deforma por la precisión del Zbuffer.
No, perder precision en el zbuffer lo que produce son artefactos cuando dos planos estan muy cercanos (el clasico parpadeo entre dos poligonos en la lejania). Pero la proyeccion sigue siendo exactamente la misma.
lee a senior wapo.
poner en znear en 0.1 y el zfar en 50 por ejemplo, y tu tarjeta gráfica soporta MAX_PLANES planos de corte,
cada plano tendrá una profuncidad de 0.1 + (50-0.1)/MAX_PLANES respecto a la cámara.
Este problema se incrementa si pones un znear muy pequeño (0.01) y un zfar muy lejano, dado que los planos están muy alejados entre sí para hacer bien el cálculo, se puede desbordar el buffer, luego para buscar que elemento está más cercano para un pixel, se toma un conjunto de elementos y no sólo un plano transformado como debería ocurrir, lo que puede causar.
Además esta diferencia es más notable sobre el znear, dado que necesita un plano más abierto que sobre el zfar, que la visibilidad no necesita tal nivel de detalle y puede hacer que te comas una esquina de un cubo y se achate, se calcule mal su normal, o incluso se dibuje un punto que ni siquiera era la esquina del cubo.
Te lo digo que a los chavales les ha pasado un montón de veces haciendo ciertas prácticas que requieren de una cámara móvil e introduciendote en el elemento.
Bueno, pero el problema de desbordar el Z Buffer no es el problema de proyeccion erronea que comenta él. Él dice que la proyeccion de toda la escena le cambia si cambia el near (pone como ejemplo el cambiar el fov) y yo digo que eso no es normal, que el near no afecta a la proyeccion.
Para ejemplo una imagen que acabo de hacer:
(http://tamat.beesbase.com/uploads/near-problem.jpg)
Yo creo que lo mejor es modificar la z del vector de traslación de la matriz de proyección. Sería algo así.
void EstablecerDistanciaDeFrustum(float dist)
{
float Matriz[16];
ObtenerMatrizProyeccion(Matriz);
Matriz[14] = dist;
EstablecerMatrizProyeccion(Matriz);
}
Esto se puede modificar en el momento que se quiera antes de dibujar algo, y con las debidas precauciones se puede dibujar diferentes objetos con diferentes distancias. El valor podría oscilar sobre 0.1 y 10 (negativo si es OpenGL).
tamat me gustan las imágenes, usas lightmaps no?
lo de cambiar la matriz de proyección en función del objeto puede salir un churro de cuidado...
Cita de: "ethernet"lo de cambiar la matriz de proyección en función del objeto puede salir un churro de cuidado...
Si no se sabe lo que se hace... desde luego.
Cita de: "marcode"Cita de: "ethernet"lo de cambiar la matriz de proyección en función del objeto puede salir un churro de cuidado...
Si no se sabe lo que se hace... desde luego.
Desde luego, sobretodo viendo el cálculo de la matriz de proyección(*) y el código que tú has puesto
(*) http://www.glprogramming.com/red/appendixf.html ultimas matrices
No sé si el código que puse antes estará bien porque lo he puesto de memoria, pero poderse se puede hacer como se puede ver en este juego.
Desde 1 cm hasta cientos de Kms vistos simultáneamente modificando la matriz de proyección y sin ningún fallo ni artefactos.
http://www.megaupload.com/?d=KAAC1K8M
Cita de: "ethernet"tamat me gustan las imágenes, usas lightmaps no?
es una mesh que hice con el sketch up, con lightmaps generados con el 3ds studio 8 (lighttracer)
hola, gracias por todos los comentarios.
Me pueden enviar la funcion en donde uds agrandan o disminuyen el near plane, no se que estare haciendo mal yo.
Miren yo lo hago en mi funcion reshape la que solo llamo al principio solo una vez ya que mi programa no necesita modo windowed asi que nunca hago reshape a la escena, solo uso la funcion reshape para dar la proyeccion a la escena nada mas(nunca mas la vuelvo a llamar):
void reshape(GLsizei w, GLsizei h)
{
allegro_gl_begin();
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0, 1.0, -1.0, 1.0, 2.0, 500.0);
glMatrixMode (GL_MODELVIEW);
glViewport (0, 0, w, h);
allegro_gl_end();
}
main()
{
reshape();
do
{
//loop en donde llamo a las diversas funciones de
//dibujado,teclas,mouse,etc
}while();
}
le pongo algo menos que 1.0 y ya se deforma demasiado .
que estoy haciendo mal?
GRACIAS.
yo uso gluPerspective (http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/perspective.html)
gluPerspective(mFov, mAspect, mNear, mFar);
Si modificas la distancia entre el near y el far, también modificas el campo de visión, por lo que tienes que ajustar también su volumen.
gluPerspective calcula el tamaño a partir de esos parámetros, pero también lo puedes hacer con glFrustum. Esta es la función que uso yo donde se puede ver que se calcula previamente el volumen a partir del near multiplicado por la tangente del fov, y se ajusta a la relación de aspecto ancho/alto de la vista
Citar
void SetPerspective(float fov, float aspect, float zNear, float zFar)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat range = zNear * tan(fov*PI/360);
glFrustum(-range*aspect,range*aspect,-range, range, zNear, zFar);
}
al igual que con gluPerspective, se le pasa el ángulo de visión, la relación de aspecto (normalmente el ancho dividido por el alto de la vista), y los planos de corte.
GRACIAS tamat y marcode.
Yo no uso glut, asi que no tengo gluperspective.
Mmmm voy a probar esa funcion.
¿Pero esto resolvera el problema inicial que tengo de que el near deje de cortar la figura?
Quiero que se vea como los screenshot de tamat(en la pagina anterior) que sea "la pantalla la que corte la figura".
Muchas gracias por responder.
Saludos.
Cita de: "xeex"GRACIAS tamat y marcode.
Yo no uso glut, asi que no tengo gluperspective.
Mmmm voy a probar esa funcion.
¿Pero esto resolvera el problema inicial que tengo de que el near deje de cortar la figura?
Quiero que se vea como los screenshot de tamat(en la pagina anterior) que sea "la pantalla la que corte la figura".
Muchas gracias por responder.
Saludos.
gluPerspective no es de glut, sino de opengl.
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/glu/perspective.html
Cita de: "xeex"¿Pero esto resolvera el problema inicial que tengo de que el near deje de cortar la figura?
Quiero que se vea como los screenshot de tamat(en la pagina anterior) que sea "la pantalla la que corte la figura".
Con gluPerspective (glu.h) o una función que haga lo mismo como la que he puesto antes, puedes reducir la distancia al near plane por debajo de 1.0 para solucionar ese problema. Pero tienes que tener en cuenta que la precisión disminuirá si el far plane es demasiado grande, y pueden aparecer fallos.
gluPerspespective es de la librería de utilizadades de opengl, y se ejecuta en espacio de usuario.
Este documento es buenísimo:
http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html
GRACIAS Buffon por la correcion.
Ah no tenia idea que no tenia nada que ver con glut. Es que una vez lei por ai que una libreria que se llamaba glaux.h ya no habia que usarla por que ya estaba caduca y ai me enrede y la confundi con glut.h ....jajaj. bueno no recuerdo bien,algo asi. Lo cierto es que no utilizo nada que empieze con glu.
Gracias por las respuestas y los links.
SALUDOS