Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda sistema coordenadas en móvil.

Iniciado por nsL, 09 de Septiembre de 2011, 12:01:58 PM

« anterior - próximo »

nsL

Buenas!

Estoy peleandome (si, es la palabra correcta) para aprender un poco con OpenGL ES 2.0 para Android. Si ya habia tocado poco en ordenador, encima lo habia hecho con versiones anteriores a la 2.0, asi que estoy mascando el "nuevo" pipeline y sus shaders.

La duda que tengo es mas de conceptos generales, pero bueno, alla va.

Tengo una proyeccion ortho, establecida con esta funcion:

    public void onSurfaceChanged(GL10 unused, int width, int height)
    {       
       GLES20.glViewport(0, 0, width, height);
       
       float ratio = (float) width / height;

       Matrix.orthoM(mProjMatrix, 0, -(width/2), (width/2), -(height/2), (height/2), -1.0f, 1.0f);
       //Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, -1.0f, 1.0f);
       
       muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
       Matrix.setLookAtM(mVMatrix, 0, 0, 0, 1, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    }

(notese que tengo comentada una linea, ya que he probado diferentes dimensiones)

Para la pantalla de mi móvil, tiene de estas dimensiones:

En modo vertical: Ancho: 480 - Alto: 724
El modo "landscape" (de lado): Ancho: 800 - Alto:404

Luego va cambiando la proyeccion, en funcion del modo (como es normal), al igual que pasaba en una app de ordenador, si redimensionabas la pantalla. No me preocupa mucho, ya que trabajaré en uno u otro modo, y limitare la app a eso. La duda que me corroe es relativa a las diferentes resoluciones en los diferentes móviles.

Mi duda es:
A la hora de distribuir los "objetos" por la pantalla, ¿que coordenadas le pongo? A ver si me explico, si quiero colocar algo en la esquina superior izquierda, pues en mi móvil se las coordenadas son unas, diferentes a las de otro móvil (el punto X:0 Y:0 esta en el medio de la pantalla). Podría mover el eje para que el (0,0) este en la esquina superior izquierda, y colocar las cosas basandome en ese punto, pero aun asi tendria problemas porque algunos móviles tendran resolucion mayor, y colocar una cosa en el (100,100) no se vera en igual posicion en un movil con resolucion 400x200 (ejemplo), que en uno mas moderno con 560x280 (otro ejemplo inventado).

Lo único que se me ocurre es trabajar en torno a una resolucion fija, y si la resolucion es mayor (otro móvil) calcular la posicion mediante una regla de 3, asi como el tamaño de los elementos....

Seguro que todo esto es una perogrullada, pero son conceptos que nunca me hicieron falta, porq siempre "trabaje" con ventanas de tamaño fijo, fijado por mi, y que no variaba.

------

Por otro lado, según veo por ahi, y volviendo al código que puse arriba (la línea comentada):
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, -1.0f, 1.0f);

Usando una proyeccion asi, soluciono el problema vertical, ya que trabajo en un rango fijo (-1,1), pero en horizontal vuelvo a tener el mismo problema, ya que ratio depende de la resolucion de la pantalla.....

No se si quedo claro, porq a veces me explico como el culo.

Muchas gracias :)

Un saludin
Yo no muero hasta la muerte -

The_Dragon_Ladis

No he programado en OpenGL para móviles pero supongo que la teoría será la misma.

Si entiendo lo que estás diciendo y no me equivoco, no deberías preocuparte de lo que comentas, ya que el sistema de coordenadas que tu utilizas (el famoso {x,y,z}) no es una medida en pixeles, sino en tu sistema de coordenadas, que luego más tarde, conforme a la configuración de tu cámara, se proyecta al dispositivo de salida.

nsL

Vamos, que da igual de cuanto haga la proyección no? Ya que luego se ve reflejada en toda la pantalla?

Es que mi duda era: si tengo una pantalla 400x200 y otra 500x200. Y hago la proyección ortho en función a las medidas de cada pantalla (para guardar la relación de aspecto) y coloco un objeto en la posición 450x150 por ejemplo, en el primer móvil no se vera ese objeto.... pero en el segundo si. Luego no se que dimensiones poner a la proyección para que sea correcta en todas las pantallas.

Igual sigo dándome cabezazos contra una pared, pero no veo como.

Yo no muero hasta la muerte -

The_Dragon_Ladis

Sigo pensando que el sistema de coordenadas usado en OpenGL no se corresponde con los píxeles de la pantalla. La correspondencia entre el sistema de coordenadas y los píxeles de la pantalla la hace la proyección.

Si fuera de otro modo sería un calvario tener que programar todas las posiciones de los objetos en función de la pantalla que tengas, de ahí que se realice esa capa de abstracción.

Pd: Hablo de lo que sé de OpenGL en PC. En móviles supongo que será lo mismo, por lógica, pero si hay algún experto por aquí que te lo confirme él.






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.