Cambiar el sistema de coordenadas en LibGDX (Java)

LibGDX tiene un sistema de coordenadas donde (0,0) está en la parte inferior izquierda. (como esta imagen: http://sofes.miximages.com/java/jVrJ0.png )

Esto me tiene golpeando la cabeza contra la pared, principalmente porque estoy portando un juego que ya había hecho con el sistema de coordenadas habitual (donde 0,0 está en la esquina superior izquierda).

Mi pregunta: ¿Hay alguna forma simple de cambiar este sistema de coordenadas?

Si usa una cámara (que debería) cambiar el sistema de coordenadas es bastante simple:

 camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

Si usa TextureRegions y / o TextureAtlas, todo lo que necesita hacer además de eso es llamar a region.flip (false, true).

Las razones por las que usamos y-up por defecto (que puede cambiar fácilmente como se ilustra arriba) son las siguientes:

  • su código de simulación muy probablemente usará un sistema de coordenadas euclidiano estándar con y-up
  • si vas en 3D, tienes y-up
  • El sistema de coordenadas predeterminado es uno diestro en OpenGL, con y-up. Por supuesto, puede cambiar fácilmente eso con un poco de magia matriz.

Los únicos dos lugares en libgdx donde usamos y-down son:

  • Coordenadas de Pixmap (origen superior izquierdo superior, y-abajo)
  • Toque las coordenadas del evento que se dan en las coordenadas de la ventana (origen superior izquierdo superior, y-abajo)

Una vez más, puede cambiar fácilmente el sistema de coordenadas utilizado a lo que desee usando Cámara o un poco de matemática matricial.

Solo para ampliar un poco sobre lo que dice badlogic anteriormente, si está usando un TextureAtlas (con TextureRegions) necesita voltearlo, como dijo badlogic, además del trabajo de la cámara. Si está utilizando un TextureAtlas, puede usar este código justo después de cargar su atlas:

 String textureFile = "data/textures.txt"; atlas = new TextureAtlas(Gdx.files.internal(textureFile), Gdx.files.internal("data")); // Let's flip all the regions. Required for y=0 is TOP Array tr = atlas.getRegions(); for (int i = 0; i < tr.size; i++) { TextureRegion t = tr.get(i); t.flip(false, true); } 

Si desea ocultar la transformación y no pensar en ella después de configurarla una vez, puede crear una clase que herede todas las funcionalidades que necesita, pero primero transforma las coordenadas antes de pasarla a la función de la clase principal. Desafortunadamente, esto tomaría mucho tiempo.

Alternativamente, puede hacer un método que haga la transformación simple y' = height - y en todo el objeto Coordinate (o lo que sea que esté usando) y llámelo una vez antes de cada operación.

Interesante biblioteca de gráficos, diría yo. Encontré esta evaluación en el siguiente enlace:

Otro problema fue que se usaron diferentes sistemas de coordenadas en diferentes partes de Libgdx. A veces, el origen de los ejes estaba en la esquina inferior izquierda con el eje y apuntando hacia arriba y, a veces, en la esquina superior izquierda del objeto apuntando hacia abajo. Al dibujar Mallas, el origen estaba incluso en el centro de la pantalla. Esto causó bastante confusión y trabajo extra para tener todo en el lugar correcto en la pantalla.

http://www.csc.kth.se/utbildning/kandidatexjobb/datateknik/2011/rapport/ahmed_rakiv_OCH_aule_jonas_K11072.pdf

Acabo de hacer una clase que extiende SpriteBatch que se SpriteBatch ciertos métodos y = Gdx.graphics.getHeight() - y - height agrega y = Gdx.graphics.getHeight() - y - height . Simple pero efectivo

No estoy seguro de si esto ayuda a alguien o no, pero pude obtener las texturas y las fonts renderizadas correctamente utilizando el sistema de coordenadas volteado sugerido a través de OrthographicCamera. Esto es lo que hice:

 private SpriteBatch batch; private BitmapFont font; private OrthographicCamera cam; private Texture tex; @Override public void create () { batch = new SpriteBatch(); font = new BitmapFont(true); font.setColor(Color.WHITE); cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); cam.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); tex = new Texture("badlogic.jpg"); } @Override public void dispose() { batch.dispose(); font.dispose(); tex.dispose(); } @Override public void render () { cam.update(); batch.setProjectionMatrix(cam.combined); Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); font.draw(batch, "Test", 50, 50); batch.draw(tex, 100, 100, tex.getWidth(), tex.getHeight(), 0, 0, tex.getWidth(), tex.getHeight(), false, true); batch.end(); } 

Cosas importantes para notar son:

  • El constructor BitmapFont, el booleano voltea la fuente
  • Para batch.draw () necesita usar todos esos parámetros porque necesita un boolean flipY al final para voltear la textura (puedo extender SpriteBatch o hacer un método de utilidad para evitar pasar tantos parámetros todo el tiempo).
  • Aviso batch.setProjectionMatrix (cam.combined); en render ()

Ahora veremos si estoy aquí más tarde esta noche haciendo modificaciones para solucionar cualquier otro problema o descubrimiento al hacer todo esto. 🙂