[Unity] 트랜스폼(Transform)에 대해 조금 더 공부하기

2022. 2. 14. 01:44Game Development/Unity

 

트랜스폼 컴포넌트(Transform Component)

 

  • 게임 오브젝트의 위치(Position), 회전(Rotation), 크기(Scale) 값을 저장하고 있는 컴포넌트
  • 부모 오브젝트와 자식 오브젝트의 계층 관계 상태를 저장하기 위해서도 사용되는 듯 하다.
  • 게임 오브젝트는 항상 하나의 트랜스폼 컴포넌트가 존재한다. (UI의 경우, Rect Transform)
  • 트랜스폼 컴포넌트가 없는 게임 오브젝트 생성은 불가능

 

부모-자식 관계 설정

 

  • 부모 오브젝트가 이동, 회전, 크기 변환을 진행할 때, 그의 자식 오브젝트 또한 정확히 동일하게 동작한다.
  • 사람의 몸이 움직이면 팔 역시 따라 움직이며, 팔은 손, 손은 손가락처럼 자식 오브젝트 또한 자식 오브젝트를 가질 수 있다.
  • 자식 오브젝트를 여러 개 가질 순 있으나, 부모 오브젝트는 단 하나만 가질 수 있다.

 

로컬 좌표계(Local Coordinates)와 월드 좌표계(Global Coordinates)

 

  • 모든 게임 오브젝트의 Inspector에서의 트랜스폼 값은 부모 트랜스폼 값에 상대적으로 나타나는 값 (로컬 좌표계)
  • 사람이 걸으면, 몸의 위치는 이동하나 팔은 여전히 몸에 대해 상대적인 위치에 존재함
  • 즉, 걷는다고 팔 또한 몸에서 떨어져서 이동하는 것은 아님. 여전히 몸이라는 중심에 대해 상대적인 위치에 존재함
  • 자식 오브젝트는 보통 로컬 좌표를 가지고 작업하는 것으로도 충분하지만, 게임 플레이 중에는 월드 공간의 정확환 위치 또는 월드 좌표계를 사용하는 것이 더 유용
  • 스크립트 상에서 트랜스폼의 로컬 및 월드 위치, 회전, 크기에 대한 프로퍼티 수정이 가능하며, 로컬과 월드 좌표 간 변환 또한 지원한다.

 

여기까지는 기본적으로 알고 있었던 내용이었다. 이 다음은 추가적으로 알게 된 내용

 

 

 

비균등 스케일(Non-Uniform Scale)

 

  • 트랜스폼 컴포넌트의 Scale x, y, z 값이 서로 다른 값을 가지고 있는 경우를 말한다.
  • 반대로, 트랜스폼의 Scale x, y, z 값이 모두 동일한 것을 균등 스케일(Uniform Scale)이라고 한다.
  • 비균등 스케일은 유용할 순 있으나, 보통 그래픽 렌더링 속도가 느려지기 때문에 사용을 피해야 한다고 한다.
  • 비균등 스케일은 균등 스케일을 사용할 때에 비해, 다음과 같은 문제가 발생할 수 있다.
    1. Sphere Collider, Capsule Collider, Light, Audio Source 등은 "radius" 프로퍼티를 통해 크기 조정이 가능한데, 게임 오브젝트를 비균등 스케일로 설정하더라도 그 모양대로 지원되지 않는다.
      • 예를 들어, 게임 오브젝트를 타원형으로 만들더라도 위와 같은 컴포넌트들은 원형을 그대로 유지한다.
    2. 부모 오브젝트가 비균등 스케일이고, 그의 자식 오브젝트가 부모 오브젝트에 대해 회전할 경우, 해당 자식 오브젝트는 삐딱하거나 "베어낸" 것처럼 보일 수도 있다.
      • 예를 들어, 비뚤어진 Box Collider는 렌더링된 메시(Mesh)의 형태와 정확히 매치되지 않을 것임 
    3. 성능과 관련된 이유로, 비균등 스케일된 부모 오브젝트의 자식 오브젝트는 회전할 때, 자동으로 스케일이 업데이트 되지 않는다. 
      • 자식 오브젝트의 형태는 자식의 스케일이 나중에 결국 업데이트 될 경우, 갑자기 변하거나 마치 자식 오브젝트가 부모 오브젝트로부터 분리된 것처럼 보이는 현상이 나타날 수도 있다.

 

 

스케일(Scale)의 중요성

 

  • 트랜스폼의 스케일은 모델링 프로그램에서의 메시 크기와 Unity에서의 메시 크기 간의 차이를 결정
  • Unity에서 메시 크기(트랜스폼의 스케일)는 매우 중요하며, 특히 물리 시뮬레이션 중에는 더 중요
  • 리지드바디가 천천히 움직이거나, 떠 있거나, 제대로 충돌하지 않는 등 예상치 못한 동작이 나올 경우에는 메시 에셋의 스케일 값을 조정해봐야 한다.
  • Unity 물리 엔진은 기본적으로 월드 공간에서 1 유닛(Unit)1m로 간주
  • 따라서, 엄청 큰 오브젝트를 떨어뜨릴 경우, 마치 슬로우 모션으로 떨어지는 것처럼 보일 수 있음
    • 실제 물리 시뮬레이션은 정확한데, 실질적으로 너무 큰 오브젝트가 긴 거리만큼 떨어지는 것으로 보는 셈
  • 외부 프로그램에서 현실 크기에 기반하여 작업한 모델을 Unity에 임포트했다면, Unity 단위에서도 일치하는지 확인해봐야 한다. (1 유닛이 1m이므로 이것에 기반하여 크기 측정이 대략 가능)

 

 

 

게임 오브젝트의 스케일(Scale)에 영향을 줄 수 있는 요인은 다음과 같이 세 가지.

 

  1. 사용하는 3D 모델링 프로그램에서의 메시 크기
  2. 오브젝트의 Import Settings 에서 Scale Factor 값 설정
  3. 트랜스폼 컴포넌트의 Scale

 

  • 제일 좋은 방법은 현실 크기로 모델을 생성하여 트랜스폼의 스케일을 변경하지 않도록 하는 것
  • 모델이 Unity에서 크기가 달라졌다면, Import Setting 에서 Scale Factor 값 조정

 

728x90
반응형