Post

Unreal: 축 좌표계(Axial Coordiante)

Unreal: 축 좌표계(Axial Coordiante)

6각형의 타일 맵은 꽤나 매력적인 선택지일 수 있다. Hex Map이라는 이름으로 불리는데 여러가지 구현법이 있긴 하겠다. 핵심은 x,y축이 직교하는 좌표계를 6각형 타일에 알맞는 좌표계로 변환하는 것인데, 예전에 처음 생각했던 방법은 벡터연산을 이용하는 법이였다.

육각형 방향벡터로 나눠서 계산하기

image 육각형을 배치하는 상황을 생각하보면 하나의 육각형에 6개 방향으로 다른 육각형이 붙을 것이란건 자연스럽게 떠오를 것이다. 그럼 그 육각형들간의 관계를 어떻게 표현할 수 있을까? 육각형의 6방향중 서로 인접하지 않는 3개의 방향을 단위백터로 사용해 3차원 백터로 나타내는 것이다. 원한다면 1개의 백터는, 나머지 2개의 단위백터 합의 음수이니 2개의 백터만으로 표현할 수도 있다. 그리고 2개의 백터만으로 표현할 수 있다면, 이는 기존의 x,y좌표에서의 성분 갯수가 같기 때문에 변환하는데 무리가 없음을 의미한다.

그렇기에 떠올린 방법은 다음과 같았다.

  • B 벡터로 y값을 한변의 육각형의 한변의 길이 +-범위 안에 들어올 때까지 나눈다, 이 과정에서 X값은 늘어나게 된다.
  • A 벡터로 남은 X값을 정리해 육각형 범위 안에 들어오게 만든다.
  • 사선보다 아래있는지 추가적으로 판단해 육각형 안인지 확인하고, 아니면 B좌표를 알맞게 +1 혹은 -1 한다.

이론적으로는 맞는 접근이다. 하지만 현실적으로는 쓰기엔 제약이 큰데, 계산 과정이 깔끔하게 맞물린다기보단 반복적이고 소모적으로 작동하기 때문이다. 게임에 사용하기 위해선 더 나은 방법이 필요하다.

Axial Coordinate: 이미 생각하던 방법의 이론 버전

당연하겠지만 타일맵은 꽤나 흔하게 쓰인 게임 요소이고, 이걸 변환할 방법을 나만 생각하지도 않았을 것이다. 이런 개념을 지칭하는 단어가 있는데 축 좌표게(Axial Coordinate)이다.

image

위에서 내가 떠올린 방법을 하나의 시스템으로 만들어놓은 형태이다. 좌표변환도 내가 생각한 방법과 유사하지만 훨씬 깔끔한 방법을 거친다.

  • x, y좌표를 A,B 벡터로 나누어 실수 단위 값으로 변환한다.
  • A,B,C방향중 반올림 과정에서의 오차가 가장 큰 값을 다른 2개 방향의 값으로 다시 계산한다. 사용하지 않는 C값이라면 별문제 없지만, A,B에서 오차가 크다면, 이는 다음 혹은 이전 타일을 가리키는 현상을 만들수 있기에 이를 보정해 수정하는 과정이다.
  • 결과에서 나온 정수값이 현재 좌표와 겹치는 타일을 알려준다.

지금 구상하는 게임이 육각형 타일에 맞추어 딱딱 움직이진 않고 자유롭게 해당 타일 위에서 이동하는 구조를 생각하기에 상황 자체는 좀 다를 수 있겠지만, xy직교 좌표게를 육각형의 axial 좌표로 변환하는 것 자체는 문제가 되지 않으며 위 방법을 그대로 따를 수 있다. 단지 게임에 따라 항상 모든 이동을 저 좌표를 기준으로 할것인지, 필요시에만 호출해 어떤 타일 위에 있는지 확인하는지등 호출 시점에 따른 차이정도만 있겠다.

언리얼에서 별도로 Axial Coordinate지원하는 함수나 방법을 제공하지는 않는다. 하지만 자체 구현해 사용하는 법 자체는 크게 어렵지 않을 것이다.

This post is licensed under CC BY 4.0 by the author.