본문 바로가기

유니티/워크플로

[Unity] 공간 변환 (World <-> Local)

반응형

유니티의 두 공간 좌표

대부분의 게임 엔진은 두 가지의 공간을 사용한다.

하나는 로컬 스페이스(Local Space)이고, 다른 하나는 월드 스페이스(World Space)이다.

 

Local Space 로컬 공간은 각각의 개별적인 게임 오브젝트의 지역 공간을 의미한다. 각 오브젝트는 자체적인 좌표계를 가지며, 이 좌표계를 기준으로 위치, 회전 및 크기가 정의된다.
World Space 월드 공간은 전체 게임 세계를 의미한다. 모든 게임 오브젝트는 월드 공간 내에서 상대적인 위치, 회전 및 크기를 가지고 있다. 월드 공간은 모든 로컬 공간의 기준이 되며, 모든 오브젝트는 월드 공간으로 변환될 수 있다.

왜 두 공간 사이의 변환이 필요할까?

우리는 월드좌표계와 로컬좌표계를 넘나드는 모든 상황에 공간 좌표계 이동이 필요하다.

예를 들어, 1인칭 FPS나 레이싱 게임의 경우 로컬에서 월드로의 이동이 필요하다.

 

왜냐면 1인칭 플레이어를 기준으로 앞으로 이동하는 경우, 플레이어는 플레이어가 바라보는 항상 같은 방향으로 이동하지만 실제 월드 좌표계에서는 플레이어의 방향에 따라 이동 벡터가 변화하기 때문이다. 따라서 이러한 경우 로컬 좌표계에서 월드 좌표계로의 변환이 필요하다.

 

반대의 경우도 존재한다. 모두 같은 각도로만 발사하는 대포들이 있다고 가정하자. 만약 하나의 대포를 특정 위치로 발포하면 다른 대포들도 이전 대포와 같은 각도로 발사한다. 어떤 대포가 (30, 40, 40)의 각도로 발사하면 각 대포들도 같은 (30, 40, 40)의 각도로 쏘는 것이다. 이때 대포들이 각자 다른 방향을 바라보고 있다면, 어떤 방향으로 발포해야 하는지 어떻게 알 수 있을까. 이때는 월드 좌표에서 로컬 좌표로의 공간 변화가 필요하다.


어떻게 변환 시킬 수 있을까?

로컬에서 월드로 변환:  transform.TransformDirection(Vector3 direction)

이 함수는 로컬 좌표계를 기준으로 direction을 지정받아 월드 좌표계를 기준으로 리턴해준다.

예를 들어서 direction을 Vector3.Forward로 해두면 transform의 로컬좌표계가 forward (0, 0, 1)인 지점을 찾아서 반환해 주는 것이다.

 

void Update()
{
    Vector3 pos = transform.TransformDirection(Vector3.forward);
    Debug.DrawLine(transform.position, pos, Color.red);
}

위와 같이 코드를 적어주고 테스트 하면 다음과 같다.

 

transform.TransformDirection

 

함수 이름이 TransformDirection인 이유는 해당 트랜스폼을 기준으로 한 방향을 입력받기 때문인 것 같다.


월드에서 로컬로 변환:  transform.InverseTransformDirection(Vector3 direction)

반면 이 함수는 월드 좌표계를 기준으로 direction을 지정받아 로컬 좌표계를 기준으로 리턴해준다.

 

예를 들어서 direction을 Vector3.Forward로 해두면 transform의 로컬좌표계가 월드 좌표계에서 forward (0, 0, 1)인 지점을 찾아 로컬 좌표계를 기준으로 반환해 주는 것이다.

void Update()
{
    Vector3 pos = transform.InverseTransformDirection(Vector3.forward);
    Debug.DrawLine(transform.position, pos, Color.red);
}

transform.InverseTransformDirection

위 예시에서 빨간선이 반대로 움직이는 이유는 간단하다. (0, 0, 1)인 지점을 transform을 기준으로 찾고, 해당 위치를 로컬좌표계를 기준으로 변환하였기 때문에 y-z평면으로 대칭인 지점에 나타나게 되는 것이다.

이는 TransformDirection의 역순과도 같다.

반응형