관리 메뉴

개발블로그

[유니티] 로컬좌표, 월드좌표 본문

그래픽스

[유니티] 로컬좌표, 월드좌표

dvmoo 2021. 7. 16. 18:29

🤷‍♀️

게임을 개발하다보면 런타임 시 오브젝트를 이동해야 하는 상황이 자주 있다.

오브젝트를 이동하기 위해서 스크립팅 후 실행했을 때, 가끔 내가 원하는 방향이 아닌 다른 방향으로 이동할 때가 있다.

그때는 좌표 문제일 가능성이 크다. 좌표 개념을 이해하지 못했다면 어떤 문제인지 찾지 못했을 것이다.

그래서 유니티 내에서의 전역좌표와 상대좌표의 개념을 확실히 정리해봐야겠다고 생각했다.

 

 


🔶월드 좌표(전역 좌표)

월드 좌표는 게임월드라는 가상의 공간의 중심을 원점으로 (0, 0, 0)으로 하는 3차원 상대 좌표계이다.

하지만 카메라의 위치나 회전 상태에 따라 달라지므로 화면의 중심이 100% 원점이라고는 할 수 없다.

 

 

🔶로컬 좌표(상대 좌표)

로컬 좌표는 오브젝트의 위치를 기준으로 한 상대 좌표이다.

오브젝트의 위치를 중심으로 생각하고 그 오브젝트의 위치에서부터 어디있는지 계산하는 것이다.

 

 

이론적인 설명은 이렇다.

 

 


✔ 월드좌표와 상대좌표의 개념을 확실히 정리해보자

 

그림-1
그림-2

오브젝트를 생성 후 트랜스폼에서 점 세개를(그림-2) 클릭하면 오브젝트의 위치가 (0, 0, 0)으로 조정되는데(그림-1)

이 위치가 바로 월드좌표의 중앙이다.

 

그림-3

 

씬에서 마우스 오른쪽 버튼을 눌러서 시점의 위치를 변경했다. 그림-3

여기서 핵심은 보이는 화면의 위치가 달라졌다고 해서 현재 화면의 중앙이 월드좌표에서의 원점은 아니다.

 

 

그림-4

 

그림4-1

 

그림4-2

 

 

Floor의 하위 오브젝트로 Cube를 넣어주고, Floor의 위치는 (5, 5, 5) 그림 4-1 Cube의 위치는 (10, 10, 10) 그림 4-2 로 맞춰주었다.

그럼 현재 Floor의 월드 좌표는 (5, 5, 5) 이고, Floor의 하위 객체인 Cube의 로컬좌표 위치는 (10, 10, 10)이다.

 

 

 

🤷‍♀️ 그렇다면 Cube의 월드좌표는?

처음에 이 부분을 머리로 생각하려 하니 잘 떠오르지 않았다. 이론 개념은 알겠는데 막상 또 이렇게 물어보면 다시 헷갈린다.

이럴땐 직접 로그를 찍어보면 되지!

 

using UnityEngine;
using System;

public class StudyCoord : MonoBehaviour
{
    [SerializeField] GameObject _gbjCube = null;

    // 버튼을 누르면 Cube의 로컬 좌표와 월드 좌표를 출력
    void CoordinateCubeLog()
    {
        Debug.Log("Local Postion  : " + _gbjCube.transform.localPosition);
        Debug.Log("World Position : " + _gbjCube.transform.position     );
    }


    public void OnBtn()
    {
        CoordinateCubeLog();
    }
}

 

 

버튼을 클릭하면 큐브의 로컬좌표와 월드좌표가 출력 되도록 해보았다.

인스펙터에서 요소들을 링크해준 뒤 실행해봤다.

 

 

GIF-1

 

그림-5

 

Cube의 로컬포지션은(10, 10, 10) 월드포지션은(15, 15, 15)로 출력되었다. 그림-5

Floor의 월드 포지션이 (5, 5, 5)였으므로 Cube의 로컬포지션에서 Floor의 월드 포지션을 더해주면 Cube의 월드포지션이 구해진다.

 

쉽게 수식으로 정리하자면,

 

✔ A의 하위오브젝트인 B의 월드포지션 구하기

A월드포지션 + B로컬포지션 = B월드포지션

 

 

 

 

 

 

 

* 공부하는 단계입니다. 잘못된 정보가 있다면 피드백 부탁드립니다😊

* e-mail : heehee970@naver.com