Unity/기능

[Unity] eulerAngles와 rotation 차이점

turbulence93 2025. 5. 28. 20:30

1. 의문점

Unity에서 회전을 다루는 방법에는 transform.eulerAngles와 transform.rotation이 있다.
두 방법 모두 회전을 표현할 수 있지만,

euler의 경우 백터값을 받아서 회전이 처리되고

rotation은 쿼터니언을 받아서 회전을 처리한다.

이 두 방식에는 어떤 차이점이 있을까?


2. 원리 및 개념 정리

eulerAngles

  • XYZ 세 축의 회전 값을 각도로 표현하는 방식.
  • 사람이 이해하기 쉽게 Vecor를 통해 값을 계산하고, Inspector에서도 쉽게 조작 가능.
  • 회전 누적은 단순히 더하기(+) 연산으로 이루어짐.
transform.eulerAngles += new Vector3(0, 90, 0); //y축을 90도 만큼 회전 시킨다.
  • 그러나 이 방식은 Gimbal Lock 현상이 발생할 수 있음.

rotation (Quaternion)

  • Unity 내부에서 사용하는 회전 표현 방식.
  • x, y, z, w로 구성된 4차원 복소수 구조로, 연속 회전에 최적화되어 있음.
  • 회전 누적은 곱하기(*) 연산으로 이루어지며, 회전 축을 잃지 않음.
transform.rotation *= Quaternion.Euler(0, 90, 0);

3. Gimbal Lock이란?

  • Gimbal Lock은 회전 축이 겹쳐지거나 하나의 축이 두 개의 회전 축과 정렬되면서
    회전축 중 하나를 잃는 현상이다.
  • 오일러 회전은 보통 Z → X → Y 순서로 회전이 적용되므로,
    특정 축의 회전이 누적되면 다른 축과 겹쳐져 회전이 무시되거나 비정상적으로 동작하게 된다.
transform.eulerAngles += new Vector3(0, 90, 0);  // 두 번 실행
  • 이 코드는 첫 번째 프레임에 Y축으로 90도 회전하고, 두 번째 프레임에 다시 Y축으로 90도 회전한다.
  • Y축을 90도씩 두 번 회전하여 오브젝트가 180도 회전한 것처럼 보이지만 실제로는 다른 축과 정렬되어 회전 축이 하나 사라짐.
    → Gimbal Lock 발생
  • Gimbal Lock이 발생하면 이후 회전에서 x,z 축 회전이 적용되지 않음

4. Quaternion은 왜 Gimbal Lock이 발생하지 않는가?

  • eulerAngles 계산과 같이 y 회전을 두번 실행 시킴
transform.rotation *= Quaternion.Euler(0, 90, 0); // 두 번 실행
  • 겉보기에는 euler 연산과 동일해 보이지만, 다른 결과를 가져온다.
  • Quaternion 내부적으로는 "Y축만 회전"하지 않음
  • Y축이 회전하면서 X, Z축에도 변화가 생김.
  • 예를 들어, 오브젝트의 초기 회전이 x: 15, y: 0, z: 20이라면
    → * Quaternion.Euler(0, 90, 0)을 두 번 하면
    → 결과는 단순히 Y축 180도가 아닌, X/Z축도 복합적으로 영향을 받은 회전이 된다.

5. 왜 이런 차이가 발생할까?

  1. EulerAngles는 Z → X → Y 순서대로 축 하나씩 돌림.
    즉, Y축만 회전하면 정말로 Y축만 회전함.
  2. Quaternion은 회전을 하나의 방향벡터 + 각도로 통합 표현
    • 회전 연산 결과는 전체 공간의 회전 좌표계를 변화시키는 것이기 때문에 회전을 반복할수록 공간 자체가 누적됨
      즉, Y축만 회전하는게 아닌 복합적인 회전이 일어남

6. 마무리

처음에는 아래 두 코드가 같은 회전을 한다고 생각했다.

transform.eulerAngles += new Vector3(0, 90, 0);
transform.rotation *= Quaternion.Euler(0, 90, 0);

 

하지만 두 방법은 근본적인 연산 방식이 달랐고,
특히 euler 회전은 Gimbal Lock과 같은 회전 정보 손실 문제가 발생하기도 했다.

 

초기값 설정이나 단순히 특정 방향을 바라보게 할때 eulerAngles을 사용하면 간단하고 직관적이고,

누적 회전, 회전 방향 제어, 보간 처리 등 정밀한 회전이 필요한 경우에는 Quaternion을 사용하는 것이 안정적이라고 느꼈다.