Nice programing

LibGDX (Java)에서 좌표계 변경

nicepro 2021. 1. 5. 21:08
반응형

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-up입니다. 물론 매트릭스 마법으로 쉽게 변경할 수 있습니다.

y-down을 사용하는 libgdx의 유일한 두 위치는 다음과 같습니다.

  • Pixmap 좌표 (왼쪽 상단 원점, y- 아래)
  • 창 좌표 (왼쪽 상단 원점, y- 아래)에 지정된 터치 이벤트 좌표

다시 말하지만, 사용 된 좌표계를 카메라 또는 약간의 행렬 수학을 사용하여 원하는대로 쉽게 변경할 수 있습니다.


위에서 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);
}

변환을 숨기고 한 번 설정 한 후에 생각하지 않으려면 필요한 모든 기능을 상속하는 클래스를 만들 수 있지만 먼저 해당 좌표를 상위 클래스의 함수에 전달하기 전에 좌표를 변환합니다. 불행히도 이것은 많은 시간이 걸립니다.

또는 y' = height - y전체 Coordinate개체 (또는 사용중인 모든 개체) 대해 간단한 변환 을 수행하는 메서드를 만들고 각 작업 전에 한 번씩 호출 할 수 있습니다.


흥미로운 그래픽 라이브러리라고 말하고 싶습니다. 아래 링크에서이 평가를 찾았습니다.

또 다른 문제는 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); render ()에서

이제 우리는 내가 오늘 밤에이 모든 작업을 수행하면서 다른 문제 나 발견을 수정하기 위해 편집을하고 여기로 돌아 왔는지 볼 것입니다. :)

참조 URL : https://stackoverflow.com/questions/7708379/changing-the-coordinate-system-in-libgdx-java

반응형