web-dev-qa-db-ja.com

LibGDXでの座標系の変更(Java)

LibGDXの座標系には、(0,0)が左下にあります。 (この画像のように: http://i.stack.imgur.com/jVrJ0.png

これは、主に通常の座標系(0,0は左上隅にある)で作成したゲームを移植しているためです。

私の質問:この座標系を変更する簡単な方法はありますか?

55
Sosavpm

カメラを使用する場合(必要な場合)、座標系の変更は非常に簡単です。

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-downを使用するlibgdxの2つの場所は次のとおりです。

  • ピックスマップ座標(左上原点、yダウン)
  • ウィンドウ座標(左上原点、yダウン)で与えられるタッチイベント座標

繰り返しますが、カメラまたはごく一部の行列演算を使用して、使用する座標系を簡単に変更できます。

118
badlogic

上記の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);
}
9
Richard

変換を非表示にし、一度設定した後は考えない場合は、必要なすべての機能を継承するクラスを作成できますが、最初に座標を変換してから親クラスの関数に渡します。残念ながら、これには多くの時間がかかります。

あるいは、Coordinateオブジェクト全体(または使用しているもの)に対して単純なy' = height - y変換を行うメソッドを作成し、各操作の前に1回呼び出すこともできます。

6
bdares

おもしろいグラフィックライブラリ、私は言うでしょう。以下のリンクからこの評価を見つけました。

別の問題は、Libgdxの異なる部分で異なる座標系が使用されていることです。軸の原点が左下隅にある場合とy軸が上を向いている場合があり、スプライトの左上隅が下を向いている場合もあります。メッシュを描画するとき、原点は画面の中央にありました。これにより、画面上の正しい場所にすべてを配置するためにかなりの混乱と余分な作業が発生しました。

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

5
ee.

特定のメソッドをオーバーライドするSpriteBatchを拡張するクラスを作成し、y = Gdx.graphics.getHeight() - y - heightを追加しました。シンプルだが効果的。

1
Ajay

これが誰かに役立つかどうかはわかりませんが、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()で

今晩、ここに戻って他の問題を修正するための編集を行っているか、これをすべて行うことで発見したかどうかを確認します。 :)

0
User