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 축이 위쪽을 가리키는 왼쪽 하단 모서리에 있었고 때로는 아래를 가리키는 스프라이트의 왼쪽 상단 모서리에있었습니다. 메시를 그릴 때 원점은 화면 중앙에있었습니다. 이로 인해 화면의 올바른 위치에 모든 것을 가져 오기 위해 상당한 혼란과 추가 작업이 발생했습니다.
나는 방금 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
'Nice programing' 카테고리의 다른 글
StreamWriter 및 UTF-8 바이트 순서 표시 (0) | 2021.01.05 |
---|---|
C # 시간 범위 밀리 초 대 TotalMilliseconds (0) | 2021.01.05 |
std :: map에 요소가 있는지 확인하는 방법은 무엇입니까? (0) | 2020.12.31 |
자산 폴더에서 이미지로드 (0) | 2020.12.31 |
Swift의 정수 배열에서 NSIndexSet 만들기 (0) | 2020.12.31 |