更改LibGDX中的坐标系统(Java)
LibGDX有一个坐标系,其中(0,0)在左下angular。 (像这个图片: http : jVrJ0.png )
这使我在墙上撞我的头,主要是因为我正在移植我已经用通常的坐标系统(其中0,0在左上angular)进行的游戏。
我的问题: 有没有简单的方法来改变这个坐标系?
如果您使用摄像机(您应该)更改坐标系非常简单:
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向上的function。 你当然可以用一些matrix魔法很容易地改变它。
在我们使用y-down的libgdx中只有两个地方是:
- 像素图坐标(左上angular原点,右下angular)
- 触摸在窗口坐标中给出的事件坐标(左上angular原点,右下angular)
再次,你可以很容易地改变使用的坐标系统任何你想要使用相机或matrix的一小部分math。
只要稍微扩展一下上面所说的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); }
如果你想隐藏转换并且在设置一次之后不想想它,你可以创build一个类来inheritance你所需要的所有function,但是在把它传递给父类的函数之前,首先转换坐标。 不幸的是,这将花费很多时间。
你也可以在整个Coordinate
对象(或者你正在使用的任何对象)上做一个简单的y' = height - y
变换的方法,在每次操作之前调用它。
有趣的graphics库,我会说。 我从下面的链接中find了这个评估:
另一个问题是在Libgdx的不同部分使用了不同的坐标系统 。 有时,坐标轴的原点位于左下angular,y轴向上,有时位于sprite的左上angular。 绘制网格时,原点甚至位于屏幕的中心。 这造成了相当多的困惑和额外的工作,让一切都在屏幕上的正确位置。
utbildning/kandidatexjobb/datateknik/2011/rapport/ahmed_rakiv_OCH_aule_jonas_K11072.pdf
我只是创build了一个扩展SpriteBatch
的类,它覆盖了某些添加y = Gdx.graphics.getHeight() - y - height
。 简单而有效。
不知道这是否有助于任何人,但我能够通过OrthographicCamera使用build议的翻转坐标系来正确渲染纹理和字体。 以下是我所做的:
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或者制作一个实用的方法来避免所有的parameter passing)。
- 注意batch.setProjectionMatrix(cam.combined); 在render()
现在我们将看看今晚稍后我是否会回头在这里做编辑修改其他问题或发现。 🙂