更改LibGDX(Java)中的坐标系

时间:2011-10-10 03:53:24

标签: java 2d sprite coordinate-systems libgdx

LibGDX有一个坐标系,其中(0,0)位于左下角。 (如下图片:http://i.stack.imgur.com/jVrJ0.png

这让我头撞墙,主要是因为我正在使用通常的坐标系(其中0,0位于左上角)移植一个游戏。

我的问题:有没有更改此坐标系的简单方法?

6 个答案:

答案 0 :(得分:117)

如果您使用相机(您应该),更改坐标系非常简单:

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

如果你使用TextureRegions和/或TextureAtlas,除此之外你需要做的就是调用region.flip(false,true)。

我们默认使用y-up的原因(您可以轻松更改,如上图所示)如下:

  • 您的模拟代码很可能使用标准的欧几里德坐标系y-up
  • 如果你去3D,你就有了<-li>
  • 默认坐标系是OpenGL中的右手坐标系,y-up。你当然可以通过一些矩阵魔法轻松改变它。

我们使用y-down的libgdx中只有两个地方是:

  • Pixmap坐标(左上角原点,y-down)
  • 触摸在窗口坐标中给出的事件坐标(左上角原点,y-down)

同样,您可以使用相机或一点点矩阵数学,轻松地将使用过的坐标系统更改为您想要的任何内容。

答案 1 :(得分:9)

只是为了扩展一下badlogic上面说的内容,如果你正在使用TextureAtlas(使用TextureRegions),你需要翻转它们,正如badlogic所说,除了相机工作。如果您使用的是TextureAtlas,则可以在加载地图集后立即使用此代码:

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<AtlasRegion> tr = atlas.getRegions();      
for (int i = 0; i < tr.size; i++) {
  TextureRegion t = tr.get(i);
  t.flip(false, true);
}

答案 2 :(得分:6)

如果你想隐藏转换而不想在设置之后再考虑它,你可以创建一个继承了你需要的所有功能的类,但首先在将坐标传递给它的父类函数之前转换坐标。不幸的是,这需要花费很多时间。

您也可以创建一个方法,对整个y' = height - y对象(或者您正在使用的任何对象)执行简单的Coordinate转换,并在每次操作之前调用一次。

答案 3 :(得分:5)

有趣的图形库,我想说。我从下面的链接中找到了这个评估:

  

另一个问题是在Libgdx的不同部分使用了不同的坐标系。有时轴的原点在于   左下角,y轴指向上方,有时指向   精灵的左上角指向下方。绘图时   网格原点甚至位于屏幕的中心。这造成了   相当多的困惑和额外的工作,以获得一切   正确的位置在屏幕上。

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

答案 4 :(得分:1)

我刚刚创建了一个扩展SpriteBatch的类,它覆盖了添加y = Gdx.graphics.getHeight() - y - height的某些方法。简单但有效。

答案 5 :(得分:0)

不确定这是否有助于任何人,但我能够通过OrthographicCamera使用建议的翻转坐标系统正确渲染纹理字体。这就是我的所作所为:

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();
}

需要注意的重要事项是:

  • BitmapFont构造函数,布尔值翻转字体
  • 对于batch.draw(),您需要使用所有这些参数,因为您需要在结尾处使用布尔值flipY来翻转纹理(我可以扩展SpriteBatch或者使用实用程序方法来避免一直传递这么多参数。)
  • 注意batch.setProjectionMatrix(cam.combined);在render()

现在我们将看看今晚晚些时候我是否会回到这里进行编辑以解决任何其他问题或发现。 :)