고현우
개발 일지
고현우
전체 방문자
오늘
어제
  • 분류 전체보기 (14)
    • Unity (7)
      • 작업 (1)
      • 지식 (6)
    • DirectX (0)
      • 작업 (0)
      • 지식 (0)
    • C# (3)
      • 디자인 패턴 (0)
      • 알고리즘 (1)
      • 자료구조 (0)
      • 지식 (2)
    • C++ (0)
      • 디자인 패턴 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 지식 (0)
    • 필수 지식 (4)
      • 물리 (0)
      • 선형대수학 (0)
      • 셰이더 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • .NET
  • 뷰포트좌표
  • 월드좌표
  • RenderingPipeline
  • Y-Up
  • Shader
  • 메모리 계층
  • 그래픽스API
  • 프래그먼트셰이더
  • 비동기
  • 렌더링파이프라인
  • 선형 탐색 알고리즘
  • 스크린좌표
  • Z-Up
  • VertexShader
  • Unity
  • 로컬좌표
  • 버텍스 셰이더
  • 래스터라이저
  • 셰이더

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
고현우

개발 일지

[Unity] 좌표계 에 대해 알아보자
Unity/지식

[Unity] 좌표계 에 대해 알아보자

2022. 1. 13. 21:41

좌표계 (Coordinate System)

 

우선 좌표계란 특정 차원의 공간에서 특정한 위치를 나타내기 위해 사용하는 방식이다

 

이러한 좌표계에는 '축' 이 존재하고 해당 선의 수직선 상에서 쉽게 특정 위치를

찾아낼 수 있다. x, y, z 총 세 개의 축으로 3차원 공간을 표현해낼 수 있으며

나머지 한 축을 뺀 x, y 축으로 좌표계를 표현한 것을 2차원 공간이라고 한다.

 

쉽게 2D, 3D 게임을 생각하면 이해하기 쉬울 것이다

 

게임들을 플레이 해보면 알 수 있듯이, 게임마다 각각 좌표를 표현하는 방식들이

제각각이다, 상하좌우로만 움직이는 게임이나, 또는 전후좌우로 움직임이 제한되는

경우가 있으니 참고해두길 바란다.

 


왼손 좌표계, 오른손 좌표계

 

좌표계는 크게 두갈래로 나뉜다, 바로 왼손 좌표계와 오른손 좌표계다.

 

https://www.oreilly.com/library/view/learn-arcore/9781788830409/03e5338d-02f1-4461-a57a-ef46a976f96b.xhtml

위의 사진을 보면 짐작이 갈것이다 둘의 공통점으로는

각각의 x, y축은 +, - 를 표현하는 데 있어 같지만

나머지 한 축인 z 축이 서로 다르다는 점이다

 

왼손 좌표계의 경우 z의 양의 방향이 화면속으로 들어가는

방향이지만, 오른손 좌표계 같은 경우 z의 양의 방향이

화면 안으로 들어가는 방향이다.

 

우리가 알고있는 DirectX, OpenGL에서도 알 수 있는 사실이다

DirectX 같은 경우 왼손좌표계를, OpenGL의 경우 오른손 좌표계를

사용한다는 사실을 말이다.

 

Unity의 경우 DirectX가 바탕으로서 자연스레 왼손 좌표계를 따르게 되었다.

 


Y-Up, Z-Up

 

기본적으로 그래픽스를 공부하신 분이나 3DS MAX 같은 툴을

써보신 분들은 익숙한 단어일 수도 있다.

 

바로 좌표의 방향을 정의 할 수 있는 Z-up, Y-up이다

X축의 경우 기본적으로 거의 모든 좌표계 내에서

수평 방향의 수직선을 기준으로 하기 때문에

크게 신경 쓰진 않아도 되고

 

문제는 Y축의 경우 앞으로 나아가는 방향과 위로 향하는 방향

총 두 가지 방식이 존재하는데

 

한게임 플레시 (드리블 러쉬)

위 사진처럼 Y를 앞으로 나아가는 방식의 게임이 존재하는데

이러한 경우 Z가 높이 축이 되어 Z-Up 방식이 적용된다.

 

(슈퍼 마리오 브라더스)

반면 Y축을 위로 향하는 방향으로 정의하는 경우,

Y가 높이 축이 되어 Y-Up 방식이 적용된다.

 


월드 좌표, 로컬 좌표

 

월드 좌표의 경우, 월드. 즉 세상을 중심으로

특정한 오브젝트가 어느 위치에 있는지를 의미하고

 

로컬 좌표는 특정한 오브젝트를 중심으로 어느 위치에 존재하는지를 의미한다.

 

조금 어렵게 들릴 수 있는데

 

현실로 비유하자면, 월드 좌표는 지구 지도에서 우리 집이 경위도 좌표로 어디 있는지,

로컬 좌표는 현재 우리 집 공간 내에서 나와 화장실의 위치는 어느 정도 떨어져 있는지를

예시로 들 수 있을 것 같다.

 

https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Coordinate_Spaces_in_Blender

 

유니티 내에서도 global, local이 툴바에 있는 것을 본 적이 있을 것이다.

 

이 버튼들을 통해 씬뷰에서 바로 대응하여 확인이 가능하다.

Global 상태에서 바라본 SceneView
Local 상태에서 바라본 SceneView

이처럼 로컬 좌표계 같은 경우는 오브젝트의 부모 자식 관계가 형성되어 있다면

접근이 가능하며, 부모가 존재하지 않은 최상위 오브젝트의 경우 로컬 좌표가

월드 좌표로 형성되어 나오게 된다.

 


스크린 좌표계, 뷰포트 좌표계

 

마지막으로 스크린 좌표계와 뷰포트 좌표계에 대해 간단히 집고 마치도록 하겠다,

 

스크린 좌표부터 알아보자

스크린 좌표도 운영체제나 사용하는 그래픽 API에 따라 방식이 다르지만

여기에서는 Unity 엔진을 기준으로 한 스크린 좌표를 설명해보도록 하겠다.

 

스크린 좌표는 도대체 언제 어디서 사용되고 필요할까?

별로 쓰임새가 없을 것 같지만 

 

화면상에 마우스의 위치를 알아내거나, UI 구성, 충돌처리 등

이 외에도 여러 요소에서 많이 사용되고 있다.

 

우선 알아보아야 할 것이 스크린 좌표계의 중점이

화면 중앙이 아닌 왼쪽 하단에 위치해 있는 것이다.

 

X축은 오른쪽으로 +, Y는 위로 +

 

오른쪽 상단은 해상도에 대응되는 크기이다.

 

이것을 가지고 직접 유니티 내에서 디버깅을 해보면

 

using UnityEngine;

public class TEST : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            print($"X : {Input.mousePosition.x}, Y : {Input.mousePosition.y}");
        }
    }
}

 

마우스를 게임 뷰의 최대한 오른쪽 상단으로 위치하게 하여 클릭을 해보면

 

위 사진 왼쪽 하단 콘솔 창에서 볼 수 있듯이 X는 설정한 해상도 X 1920에 가까운 값이,

Y도 설정한 해상도 Y 1080에 가까운 값이 나오는 것을 확인할 수 있다.

 

 

뷰포트 좌표계를 설명해보자면

 

간단히 위에서 설명했던 스크린 좌표를 정규화한 것이다.

정규화란, 스칼라 값을 1로 만든 것이다

 

고등학교 수학 시간에 sin, cos, tan에 대해 간단히 배운 적이 있을 것이다,

그때도 좌표 계내에서 단위 원을 본 적이 있을 텐데 이것 또한 원을 길이를

1로 정규화시킨 것이다.

 

뷰포트 좌표계

 

따라서 16:9 해상도이던, 9:16 해상도이던 2:2 해상도이던

해상도에 관계없이 길이를 1로 정규화시켜주어서

 

실제 화면에서 몬스터가 화면 밖으로 나갔는지

또는 다시 들어왔는지 등

 

스크립트 내에서도 멀티 해상도를 대응할 걱정 없이

손쉽게 작업할 수가 있다.

 

그리고 위에 사진에서도 알 수 있듯이 뷰 포트 좌표계는

스크린 좌표계와는 달리 왼쪽 하단이 중점이 아닌

왼쪽 상단이 좌표계의 중심이 된다.

 

이 외에도 극 좌표계, 구면 좌표계 등 많은 좌표계들이 존재하니

필요하다면 직접 검색을 해보며 찾길 바란다.

 


레퍼런스 사이트

 

https://codingmania.tistory.com/180

 

[유니티] 스크린 좌표계와 월드 좌표계 그리고 뷰포트 좌표계

스크린 좌표와 월드 좌표의 혼란때문에 머리가 복잡하다. 월드좌표로 하고 있는데 갑자기 스크린 좌표로 코드가 설정되었는지 이상해지고 있다. 예를 들어, 어떤 플레이어 캐릭터가 센터(0,0)에

codingmania.tistory.com

 

http://slaveofcod.egloos.com/v/1187872

 

코딩의노예 : 스크린 좌표를 이용하여 월드 좌표 구하기 1편 : gluUnProject 이용

화면상에 마우스로 클릭(스크린 좌표)한 3차원 물체의 월드 좌표를 구하는 일은 피킹, 충돌처리 여러 요소에서 많이 쓰인다.  화면상에 마우스로 클릭한 위치의 월드 좌표를 구하는 방법은

slaveofcod.egloos.com

저작자표시 (새창열림)

'Unity > 지식' 카테고리의 다른 글

[Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자  (0) 2022.01.11
[Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자  (0) 2022.01.05
[Unity] Attribute 에 대해 알아보자  (0) 2021.12.21
[Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자  (0) 2021.12.20
[Unity] Delta Time 에 대해 알아보자  (0) 2021.12.19
    'Unity/지식' 카테고리의 다른 글
    • [Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자
    • [Unity] 쿼터니언과 짐벌락 현상에 대해 알아보자
    • [Unity] Attribute 에 대해 알아보자
    • [Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자
    고현우
    고현우
    Unity / DirectX 게임 개발

    티스토리툴바