簡體   English   中英

在 LibGDX (Java) 中更改坐標系

[英]Changing the Coordinate System in LibGDX (Java)

LibGDX 有一個坐標系,其中 (0,0) 位於左下角。 (像這張圖片: http : //i.stack.imgur.com/jVrJ0.png

這讓我頭撞牆,主要是因為我正在移植一個我已經用通常的坐標系(其中 0,0 位於左上角)制作的游戲。

我的問題:有什么簡單的方法可以改變這個坐標系嗎?

如果您使用相機(您應該使用),則更改坐標系非常簡單:

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)

同樣,您可以使用相機或一點點矩陣數學輕松地將使用的坐標系更改為您想要的任何坐標系。

只是稍微擴展一下 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);
}

如果你想隱藏變換,設置一次后不去想它,你可以創建一個繼承你需要的所有功能的類,但在將其傳遞給其父類的函數之前先變換坐標。 不幸的是,這需要很多時間。

您也可以創建一個方法,對整個Coordinate對象(或您正在使用的任何對象)執行簡單的y' = height - y變換,並在每次操作之前調用它一次。

有趣的圖形庫,我會說。 我從下面的鏈接中找到了這個評估:

另一個問題是Libgdx 的不同部分使用了不同的坐標系 有時軸的原點在左下角,y 軸指向上方,有時在精靈的左上角指向下方。 繪制網格時,原點甚至位於屏幕中央。 這導致了相當多的混亂和額外的工作,以將所有內容都放在屏幕上的正確位置。

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

我剛剛創建了一個擴展SpriteBatch的類,它覆蓋了添加y = Gdx.graphics.getHeight() - y - height某些方法。 簡單但有效。

我能夠通過 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); 在渲染()

現在我們將看看我今晚晚些時候是否會回到這里進行編輯以解決所有其他問題或發現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM