[Unity] 절대좌표, 상대좌표
좌표계
좌표란 공간에서 어떠한 위치를 나타내기 위한 표현으로 축을 사용하여 해당 위치를 표현한다.
3D에서는 x,y,z 축으로 나태냄
유니티에서는 x축이 오른쪽, y축이 위쪽, z축이 앞을 가리키는 왼손좌표계를 기준으로 사용한다.
절대 좌표(월드 좌표)
절대 좌표란 기준점을 중심으로 현재 위치를 표현하는 것
기준점이란, 유니티 씬상에서 x,y,z의 좌표가 모두 0인 좌표가 기준점이다.
기준이 존재하기 때문에 0,0,0을 기준으로 x,y,z의 축을 쉽게 적용하여 생각이 가능하다.
상대 좌표(로컬 좌표)
오브젝트를 기점으로 현재 위치를 나타내는 것
절대 좌표는 0,0,0이 기준이라면 상대 좌표는 오브젝트의 위치를 0,0,0으로 나타낸다.
부모로 지정한 오브젝트의 위치에서 x축으로 1, y축으로 3떨어진 오브젝트를 나타낸다고 할 때 절대 좌표는 부모 오브젝트 위치에서 해당 좌표만큼 플러스하여 계산해야 하지만 상대좌표로 생각할 경우 좌표는 1,3으로 나타낼 수 있다.
실제로 유니티 상에서도 자식오브젝트의 포지션은 상대좌표가 적용된 모습을 볼 수 있다.
테스트
- translate(게임오브젝트를 상대적으로 이동시킨다.)
- 캐릭터를 이동시킬때 주로 사용..
cube는 월드좌표 0,0,0원점에 위치 시키고 rotation의 y를 -90회전시키고 sphere를 자식으로 두고 상대 좌표를 1,1,1로 둔다.
sphere의 절대좌표 또한 1,1,1 cube가 원점이기 때문에..
sphere에 move스크립트를 넣어준다.
public class move : MonoBehaviour
{
public float speed = 1f;
private void Update()
{
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.forward * Time.deltaTime * speed, Space.Self);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.forward * Time.deltaTime * speed, Space.World);
}
}
}
A와 S의 차이점은 Space를 Self, World로 둔다는 차이점이 있다.
같은 forward(0,0,1)의 방향을 가리킨다.
하지만 좌표계가 다르기 때문에 실행해보게 되면 다른 방향으로 전진함을 알 수 있다.
앞서 cude의 회전값을 변경하였기 때문에 self의 경우 상대적인 좌표의 z축을 향하게되고 world의 경우 절대적인 왼손좌표계의 z축방향을 향하게 된다.
같은 맥락으로 해당 스크립트를 sphere에서 제거하고 cude에 넣은 다음 움직일 때 shpere의 transform값이 변경되지 않는 것을 확인할 수 있다.
위와 같이 명시적으로 좌표계를 표시할 수 있지만 뒤에 작성하지 않는다면 디폴트로 로컬좌표로 계산되게 된다.
- transform.postion vs transform.localPostion
생각하는 그대로 postion의 값은 절대좌표의 값을 나타내고 localPostion은 상대좌표의 값을 나타낸다.
위의 환경을 그대로 cube의 위치를 2,2,2 그리고 sphere의 위치를 1,1,1으로 준다.
sphere의 절대좌표는 3,3,3이 된다.
public class move : MonoBehaviour
{
public float speed = 1f;
private void Update()
{
if (Input.GetKey(KeyCode.A))
{
transform.position = new Vector3(3, 3, 3);
}
if (Input.GetKey(KeyCode.S))
{
transform.localPosition = new Vector3(3, 3, 3);
}
}
}
위의 스크립트를 sphere에 적용시키고 실행시키면 절대좌표 A의 경우 위치의 변화는 없지만 S의 경우 cude로 부터 3,3,3멀어진 위치로 이동된다.
따라서 transform.postion
의 경우 스크립트의 값과 일치하지 않을 수 있다.
sphere의 경우 cude의 자식이기 때문에 절대 좌표값으로 이동하게 되면 해당 좌표값 만큼 표시되는 postion의 값이 차이난다.
transform.localPostion의 경우 부모가 존재하지 않다면 원점의 기준이 되기 때문에 transform.postion과 동일하다.
추가 정보(02/27)
초기 오브젝트 생성 시 위치가 0,0,0이 아닌 다른 설정으로 설정되는 경우가 있다.
카메라 기준으로 생성하기 때문
오른쪽 클릭 후 reset을 호출하면 되지만 이는 귀찮거나 까먹는 경우가 있어서 위치에 대한 값이 차이가 날 수 있다.
- ctrl + k 를 통해
Scene view
를 검색한다. - Create Objects at Origin 항목을 활성화 한다.
활성화 하게 된다면 오브젝트 생성 시 위치가 전부 초기값이 0,0,0 으로 설정된다.
댓글남기기