Unity Transform 회전

2025. 3. 3. 01:45Unity 게임 프로그래밍/Unity 이해하기

728x90
반응형

1. Transform 회전 개요

유니티에서 객체의 회전을 제어할 때 주로 오일러 각(Euler Angles)과 쿼터니언(Quaternion)을 사용한다.

이 두 방식은 각각의 장단점이 있으며, 올바르게 사용하기 위해서는 그 수학적 배경을 이해하는 것이 중요하다.

1.1 오일러 각 (Euler Angles)

오일러 각은 X, Y, Z 축을 기준으로 회전을 순차적으로 적용하는 방식이다.

예를 들어, 유니티 트랜스폼 컴포넌트의 rotation(30, 45, 60)을 입력하면 X축으로 30°, Y축으로 45°, Z축으로 60°으로 회전하는 것을 의미한다.

Unity에서는 기본적으로 Z X Y 순서로 적용되며(Intrinsic Rotation 방식), 각 회전이 이전 축에 따라 변하는 방식이다.

 

장점

직관적인 이해가 쉽다.

각 축별 회전값을 쉽게 수정할 수 있다.

 

단점

짐벌 락(Gimbal Lock) 현상이 발생할 수 있다.

복잡한 회전을 표현하기 어렵다.

 

수학적 표현

 

 

짐벌 락(Gimbal Lock)

 

짐벌 락은 오일러 각을 사용할 때 발생할 수 있는 회전 문제로, 두 개 이상의 회전축이 겹침으로 인해 회전 축이 하나 감소하는 현상이다.

이로 인해 특정 방향으로의 회전이 불가능해지거나 예기치 않은 동작이 발생할 수 있다.

유니티에서는 트랜스폼 컴포넌트에 회전값(오일러 각)을 입력하면 쿼터니언으로 변환함으로써 짐벌락 문제를 방지한다.

 

1.2 쿼터니언 (Quaternion)

쿼터니언은 4차원 복소수로 표현되는 회전 방식으로, 하나의 스칼라 값(w)3개의 벡터 값(x, y, z)으로 구성된다.

 

 

쿼터니언은 회전 축과 각도를 기반으로 회전을 표현하며, 짐벌 락 없이 부드러운 회전이 가능하다.

 

오일러각에서 쿼터니언으로의 변환 공식

 

장점

짐벌 락 문제가 없다.

부드러운 회전과 보간이 가능하다.

 

단점

직관적으로 이해하기 어렵다.

디버깅이 까다롭다.

 

③  유니티에서 쿼터니언과 오일러 각 변환 함수:

  • 오일러 각 → 쿼터니언:
Quaternion q = Quaternion.Euler(30f, 45f, 60f);
  • 쿼터니언 → 오일러 각:
Vector3 euler = q.eulerAngles;

2. Transform 회전 구현 방법

 

2.1. Transform.Rotate

Transform.Rotate는 로컬 축 또는 월드 축을 기준으로 덧셈 방식으로 회전을 추가한다.

 

예제 코드

public float velocity;

void Update()
{
    transform.Rotate(new Vector3(0, velocity, 0) * Time.deltaTime);
}

프레임 당 Velocity 속도로 회전

 

설명

매 프레임마다 Y축을 기준으로 velocity 속도로 회전한다.

 

추천 사용처

연속적인 회전 애니메이션 (: 바람개비, 레이더 회전)

입력에 따른 회전 조작 (: 키보드 입력에 따른 캐릭터 회전)

 

2.2. Transform.rotation

객체의 절대적인 회전 값을 설정한다.

 

예제 코드

public Transform target;

void Update()
{
    if (Input.GetKey(KeyCode.A))
    {   // 객체를 정면으로 바라보게 설정
        transform.rotation = Quaternion.identity;
    }
    else if (Input.GetKey(KeyCode.S))
    {
        // 다른 객체를 바라보게 회전
        transform.rotation = Quaternion.LookRotation(target.position - transform.position);
    }
}

객체를 정면/Target을 바라보도록 설정

 

설명

Quaternion.identify: (0, 0, 0) 방향으로 설정

Quaternion.LookRotation: 지정된 방향으로 설정

target.position transform.position: 현재 위치에서 target 방향으로 바라보도록 설정

 

추천 사용처

정밀한 회전 설정 (: 특정 방향으로 객체 배치)

특정 방향으로의 회전 적용 (: 캐릭터가 목표 방향을 바라보도록 설정)

 

2.3. Quaternion.Lerp & Quaternion.Slerp

두 쿼터니언 사이를 보간하여 부드러운 회전을 구현할 수 있습니다.

 

예제 코드

Lerp

 public Transform target;
 public float velocityInterpolation;                  // 보간 속도
 void Update()
 {
     Quaternion targetRotation = Quaternion.LookRotation(target.position - transform.position);
     transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, velocityInterpolation);
 }

 

Slerp

public Transform target;
public float velocityInterpolation;                  // 보간 속도
void Update()
{
    Quaternion targetRotation = Quaternion.LookRotation(target.position - transform.position);
    transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, velocityInterpolation);
}

 

설명

현재 회전에서 목표 회전으로 부드럽게 전환한다.

 

추천 사용처

Lerp: 간단한 회전 전환 (: UI 애니메이션, 낮은 정확도가 필요한 경우)

Slerp: 자연스러운 회전 전환 (: 캐릭터 회전, 카메라 회전, 정확도가 중요한 경우)

 


3. Transform 회전의 장단점

3.1. 장점

유연성: 다양한 회전 방법을 제공하여 원하는 방식으로 구현할 수 있다.

부드러운 전환: 쿼터니언을 이용해 부드러운 회전과 보간이 가능하다.

 

3.2. 단점

직관성 부족: 쿼터니언 기반 회전은 직관적으로 이해하기 어렵다다.

복잡성: 짐벌 락을 피하기 위한 추가적인 학습이 필요하다.


4. Transform 회전 시 주의사항

짐벌 락 방지: 복잡한 회전이 필요한 경우 오일러 각 대신 쿼터니언을 사용해야 한다.

로컬 vs 월드 좌표: 로컬 좌표 기준으로 회전할 경우 Transform.Rotate에서 Space.Self을 추가하거나 Transform.rotation 대신 Transform.localRotation을 사용한다.

// 로컬 좌표계 기준 회전
   transform.Rotate(Vector3.up * 90, Space.Self);
   transform.localRotation = Vector3.up * 90;

 

보간 사용: 부드러운 회전 전환을 위해 Quaternion.Slerp를 사용한다.

디버깅: 쿼터니언 값을 직접 디버깅하기 어렵기 때문에 디버깅이 필요한 경우 `eulerAngles`로 변환해 확인한다.

Debug.Log(transform.rotation.eulerAngles);
728x90
반응형

'Unity 게임 프로그래밍 > Unity 이해하기' 카테고리의 다른 글

Unity Transform 이동  (8) 2025.01.10
Unity Transform 이해하기  (3) 2024.12.29