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を持っています
  • デフォルトの座標系は、y-up を使用した OpenGL の右手系です。もちろん、これはマトリックス マジックで簡単に変更できます。

libgdx で y-down を使用する場所は次の 2 つだけです。

  • Pixmap 座標 (左上原点、y-down)
  • ウィンドウ座標 (左上の原点、y-down) で指定されたタッチ イベントの座標

繰り返しますが、使用する座標系は、カメラまたはちょっとした行列演算を使用して、好きなように簡単に変更できます。

于 2011-10-13T08:11:05.930 に答える
6

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

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

于 2011-10-10T04:13:25.383 に答える
5

面白いグラフィックライブラリだと思います。私は以下のリンクからこの評価を見つけました:

もう1つの問題は、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); に注意してください。render() で

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

于 2015-10-04T18:33:26.470 に答える