게임 프로그래밍을 배우면서, 처음에 헤메이게 되는 들이 몇 가지 있는데, 그 중 하나가 로컬과 월드의 개념이다.

나중에 보면 정말 간단한 개념인데, 왜 그 땐 참 헷갈렸을까?

 

로컬 스페이스와 월드 스페이스.

간단하게 정리하면 이렇다.

 

로컬은 상대적인 것.

월드는 절대적인 것.

 

(참고로 언리얼 엔진에서도 로컬 트랜스폼은 Relative로 표현한다.)

 

그렇다면, 로컬은 뭔데 상대적이라는 거고 월드는 뭔대 절대적이라는 걸까?

 

먼저, 하나의 예시를 들어보겠다.

 

우주에는 태양이 있고, 태양 주위를 도는 지구가 있다.

실제에선 지구가 타원을 그리며 공전하지만, 이해하기 쉽게 정확히 원을 그리며 공전한다고 가정해보자.

 

 

주황색 원이 태양이며, 검은색 원이 지구이다.

태양은 (0,0)좌표에 존재하고 지구는 태양과 중심사이의 거리가 10이라고 해보자.

 

이 때, 지구는 계속 태양 주위를 돌며 공전하지만, 태양과의 거리는 10으로 항상 일정할 것이다.

만약 지구가 태양의 정확히 오른쪽에 존재한다면 지구의 좌표는 (10, 0) 일 것이다.

정확히 위에 존재한다면, (0, 10) 일 것이고, 정확히 왼쪽이라면 (-10, 0) 일 것이며, 정확히 아래라면 (0, -10) 일 것이다.

 

그렇다면, 태양이 만약 (30, 30)으로 이동한다면?

 

지구는 항상 태양을 기준으로 움직이기 때문에, (30, 30) 을 기준으로 10만큼 거리가 떨어진 위치에서 공전을 할 것이다.

 

이 개념에서 보자. 지구는 항상 태양을 기준으로 10이라는 고정된 수치만큼 떨어진 거리에 위치한다.

태양이 움직이면, 지구의 좌표도 태양이 이동한 만큼 이동할 것이다.

 

여기서, 10이라는 거리가 로컬 좌표와 동일한 개념이다.

로컬 좌표는 특정 좌표를 기준으로 얼만큼 떨어져 있는가? 를 의미한다.

 

반면, 지구가 정확히 태양의 왼쪽에 위치한다고 가정했을 때,

태양이 (0,0) 일 때 지구는 (10, 0) 이었지만, 태양이 (30, 30)으로 이동하게 되면 지구는 (40, 0) 으로 이동한다.

 

여기서 (40, 0)이라는 지구의 좌표가 월드 좌표와 동일한 개념인 것이다.

모든 사물을 동일한 공간에 배치했을 때, 최종적으로 어디에 위치하는가? 이게 월드 좌표의 개념이다.

 

물론, 이런 로컬 공간, 윌드 공간이 아니라, 로컬 좌표와 월드 좌표에 대한 개념이다.

이 개념은 위치 뿐만이 아니라, 크기와 회전에 대해서도 적용할 수 있다.

 

로컬 공간은 혼자만 있는 공간에서 지니고 있는 크기, 회전, 이동에 대한 수치이다.

부모 자식 관계가 없다면, 크기는 1을 기준으로, 회전은 (0, 0, 0)을 기준으로, 위치는 (0, 0, 0)을 기준으로 할 것이다.

 

하지만, 다른 물체와 부모 자식 관계가 맺어진다면, 기준은 부모의 크기, 부모의 회전, 부모의 위치가 된다.

 

즉, 로컬 공간에 있는 물체의 기준점은 언제 어디서든 바뀔 수 있다.

절대적인 개념이 아닌 것이다.

 

하지만, 월드 공간에서의 좌표는 무조건 (0,0,0)이 기준이다. 월드 공간의 기준점은 모든 물체가 공유한다.

 

지구라는 오브젝트가 태양이라는 오브젝트를 부모로 두고 있다면,

월드 공간에는 태양이라는 오브젝트가 배치되고, 그 태양으로부터 10만큼 떨어진 위치에 지구가 배치되는 것이다.

 

그렇다면 이 개념이 어디에 어떻게 쓰일까?

물론, 여러가지 로직에 사용될 수 있지만 매쉬와 버텍스에 사용되는 것을 예시로 들고 싶다.

 

 

이 주전자를 게임 내에서 옮긴다고 해보자. 기본적으로 이런 매쉬들은 버텍스라는 점들의 집합이다.

도형을 보면 여러개의 삼각형으로 이루어져 있는데, 이 삼각형들은 폴리곤이라 하며 삼각형의 각 꼭짓점을 버텍스라고 한다.

 

만약, 로컬 좌표라는 개념이 없이 월드만을 기준으로 이 주전자를 움직인다고 하면 언뜻 보기에도 수백개는 되어 보이는 버텍스들의 위치관계를 정밀하게 재현하며 이동하려면 참 귀찮고 짜증나는 연산이 요구될 것이다. 이동은 그렇다 치더라도 회전까지 고려하게 되면 정말 복잡한 연산이 필요할 것이다.

 

하지만, 실제론 어떻게 작동하냐면 저 메쉬엔 피봇이라 하는 기준점이 하나 설정되어 있다.

모든 버텍스는 그 피봇을 기준으로 얼만큼 떨어져 있고, 얼만큼 회전했는지 등에 대한 정보를 담고 있을 뿐이다.

 

저 주전자를 월드 공간에 배치한다면 실제로 우리가 제어하는 것은 피봇 하나이고, 그 피봇을 기준으로 모든 버텍스가 정해진 거리, 정해진 회전값으로 아주 균일하게 이동하는 것이다.

 

또 하나의 예시를 들어보자면, 플레이어와 무기의 관계를 보자.

 

위 게임에서 플레이어를 보면, 플레이어는 무기를 들고 있다.

무기와 플레이어는 한 덩어리가 아니다. 플레이어를 기준으로 어떠한 위치에 존재할 뿐이다.

 

여기서, 로컬 좌표의 개념 없이 무기의 좌표를 플레이어의 손에 딱 맞추려면 무슨 짓을 해야할까?

플레이어가 이동할 때마다, 애니메이션이 바뀔 때마다 손의 위치를 찾아가며, 무기의 위치를 갱신해야 할 것이다.

하지만 로컬 좌표의 개념을 이용한다면, 무기의 부모를 플레이어의 손으로 설정한 뒤 거리, 회전, 크기 값을 조정해주면 그 이후엔 우리가 신경 쓸 일이 없다.

 

로컬 좌표와 월드 좌표는 굉장히 간단한 개념이지만, 처음 배울 땐 왠지 모르게 참 헷갈리는 존재이다.

(나만 그랬나??)

 

누구에게든 도움이 됐으면 좋겠다

+ Recent posts