58

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

这让我把头撞到了墙上,主要是因为我正在移植一个我已经用通常的坐标系制作的游戏(其中 0,0 在左上角)。

我的问题:有什么简单的方法可以改变这个坐标系吗?

4

6 回答 6

126

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

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 你有 y-up
  • 默认坐标系是 OpenGL 中的右手坐标系,y 向上。你当然可以用一些矩阵魔法轻松改变它。

我们在 libgdx 中使用 y-down 的唯一两个地方是:

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

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

于 2011-10-13T08:11:05.930 回答
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);
}
于 2013-08-24T03:25:42.737 回答
6

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

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

于 2011-10-10T04:13:25.383 回答
5

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

另一个问题是Libgdx 的不同部分使用了不同的坐标系。有时轴的原点在左下角,y 轴向上,有时在精灵的左上角向下。绘制网格时,原点甚至位于屏幕中心。这导致了相当多的混乱和额外的工作,以便将所有内容都放在屏幕上的正确位置。

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

于 2011-10-10T04:20:01.413 回答
1

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

于 2016-08-18T19:33:12.083 回答
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); 在渲染()

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

于 2015-10-04T18:33:26.470 回答