Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Obtener las coordenadas en pantalla de un objeto 3D OpenglES

Iniciado por diluo, 08 de Abril de 2008, 03:06:51 PM

« anterior - próximo »

diluo

Buenas, estoy tratando de obtener las coordenadas en pantalla de un objeto 3D en Opengl ES.

En OpenGL normal he visto que se puede usar gluProject, pero desafortunadamente en Opengl ES 1.0 no está disponible.

Alguien tiene idea de cómo podría ser?
Sería algo asi como aplicarle la matriz de rotación de la cámara al objeto y luego multiplicar por la matriz de proyección?

Muchas gracias por anticipado
Saludos

ethernet

glu no son más que librerías de utilidadesm así que puedes emular tú el comportamiento y listo.

Qué andas haciendo con openglES?

tamat

O puedes copiar el codigo de gluProject.

En cualquier caso solo tienes que coger la ModelViewProjection y multiplicarla por el punto.
Por un stratos menos tenso

BeRSeRKeR

Hola.

/* projection du point (objx,objy,obz) sur l'ecran (winx,winy,winz) */
GLint gluProject(GLdouble objx, GLdouble objy, GLdouble objz,
          const GLdouble model[16], const GLdouble proj[16],
          const GLint viewport[4],
          GLdouble * winx, GLdouble * winy, GLdouble * winz)
{
 /* matrice de transformation */
 GLdouble in[4], out[4];

 /* initilise la matrice et le vecteur a transformer */
 in[0] = objx;
 in[1] = objy;
 in[2] = objz;
 in[3] = 1.0;
 transform_point(out, model, in);
 transform_point(in, proj, out);

 /* d'ou le resultat normalise entre -1 et 1 */
 if (in[3] == 0.0)
   return GL_FALSE;

 in[0] /= in[3];
 in[1] /= in[3];
 in[2] /= in[3];

 /* en coordonnees ecran */
 *winx = viewport[0] + (1 + in[0]) * viewport[2] / 2;
 *winy = viewport[1] + (1 + in[1]) * viewport[3] / 2;
 /* entre 0 et 1 suivant z */
 *winz = (1 + in[2]) / 2;
 return GL_TRUE;
}


/*
* Transform a point (column vector) by a 4x4 matrix.  I.e.  out = m * in
* Input:  m - the 4x4 matrix
*         in - the 4x1 vector
* Output: out - the resulting 4x1 vector.
*/
static void transform_point(GLdouble out[4], const GLdouble m[16], const GLdouble in[4])
{
#define M(row,col) m[col*4+row]
 out[0] = M(0,0) * in[0] + M(0,1) * in[1] + M(0,2) * in[2] + M(0,3) * in[3];
 out[1] = M(1,0) * in[0] + M(1,1) * in[1] + M(1,2) * in[2] + M(1,3) * in[3];
 out[2] = M(2,0) * in[0] + M(2,1) * in[1] + M(2,2) * in[2] + M(2,3) * in[3];
 out[3] = M(3,0) * in[0] + M(3,1) * in[1] + M(3,2) * in[2] + M(3,3) * in[3];
#undef M
}


Sacado de aquí.

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

diluo

Muchas gracias por las respuestas.

Veo que necesito la matriz de perspectiva, la de modelado y la de proyección.

Para obtenerlas he usado

glGetIntegerv (GL_MODELVIEW_MATRIX, mModel);
glGetIntegerv (GL_PROJECTION_MATRIX, pModel);

Pero veo que estas matrices son ceros y unos, no creo que tengan información de la cámara...

Por cierto no son 3 matrices? La de perspectiva no se como se llama.

Muchas gracias de nuevo, sois los mejores,
estoy tratando de hacer un juego en symbian con opengl, hasta ahora solo he hecho cosas en 2D, podeis ver mis juegos en www.mobilegamespro.com no se venden nada pero me gusta hacerlos jeje

BeRSeRKeR

Cita de: "diluo"Por cierto no son 3 matrices? La de perspectiva no se como se llama.
La perspectiva es un tipo de proyección, o sea que hablamos de la misma matriz.

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

tamat

Si son todo ceros y unos será que todavía no has hecho el lookat ni el perspective o que en su defecto los has hecho mal (aunque si se ve como esperas entonces es que estan bien).
Por un stratos menos tenso

senior wapo

Cita de: "diluo"
glGetIntegerv (GL_MODELVIEW_MATRIX, mModel);
glGetIntegerv (GL_PROJECTION_MATRIX, pModel);

Pero veo que estas matrices son ceros y unos, no creo que tengan información de la cámara...

Por cierto no son 3 matrices? La de perspectiva no se como se llama.
Si usas glGetIntegerv te devuelve números enteros, no en coma flotante, y pierdes todos los decimales. Como los números normalmente están, en valor absoluto, entre 0 y 2 ( 0.75, 1.333,...), lo que estás obteniendo no te vale de nada.

Usa glGetFloatv en lugar de glGetIntegerv.

Si, son 3 matrices pero en opengl se usan 2 porque se combinan la de mundo y objeto en una sola llamada modelview. Es la primera que intentas recuperar (GL_MODELVIEW_MATRIX).
La de "perspectiva" se llama matriz de proyección  y es la segunda que estás obteniendo (GL_PROJECTION_MATRIX).

diluo

He implementado la función gluProject, y obtengo las matrices que necesita con:
glGetFloatv (GL_MODELVIEW_MATRIX, mModel);
glGetFloatv (GL_PROJECTION_MATRIX, pModel);

Pero no me dá el resultado esperado.
Creo que no se donde tengo que coger la matriz modelview:

¿Tengo que cogerla una vez dibujados todos los objetos 3D?

¿Tengo que cogerla justo despues de crearse la modelview para el objeto 3D que me interesa saber sus coordenadas en pantalla?

¿O tengo que crear la modelview solo con la matriz de rotación y traslación de la cámara? Esto lo digo porque como a gluProject le paso las coordenadas 3D del objeto 3D, no tiene sentido que la matriz modelview fuese creada con la posición de ese objeto 3D + la posición y giro de la cámara, pues le estaría pasando a gluProject dos veces la posicion del objeto 3D.

En fin que estoy atascado, muchas gracias por vuestra ayuda, espero que este hilo le sirva también a más gente. Saludos.

diluo

JEJE CONSEGUIDO, menos mal porque me estaba amargando.

Gracias a todos   ;-)

Tei

Cita de: "diluo"JEJE CONSEGUIDO, menos mal porque me estaba amargando.

Siempre puedes hacer mantequilla.

Digo.






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.