Version: 2020.2
스케일 제약
광원

Unity의 회전 및 오리엔테이션

3D 애플리케이션에서 회전은 일반적으로 쿼터니언 또는 오일러 각으로 표현됩니다. 각 방법에는 고유한 용도와 단점이 있습니다. Unity는 내부적으로 쿼터니언을 사용하지만 쉽게 편집할 수 있도록 인스펙터에 해당 오일러 각의 값을 표시합니다.

오일러 각 및 쿼터니언

오일러 각

Euler angles are represented by three angle values for X, Y and Z that are applied sequentially. To apply an Euler rotation to a particular GameObject, each rotation value is applied in turn, as a rotation around its corresponding axis.

  • 장점: 오일러 각은 세 각으로 구성된 직관적이고 “사람이 읽기 쉬운” 포맷으로 표시됩니다.
  • 장점: 오일러 각은 180도가 넘는 회전을 통해 특정 오리엔테이션에서 다른 오리엔테이션을 향해 도는 회전을 나타낼 수 있습니다.
  • 한계: 오일러 각에는 짐벌 락 문제가 있습니다. 세 회전을 차례로 적용하는 경우 첫 번째 또는 두 번째 회전의 결과로 세 번째 축이 이전 축 중 하나와 같은 방향을 가리킬 수 있습니다. 이 말은 세 번째 회전값을 고유 축에 적용할 수 없기 때문에 “자유도”가 상실되었음을 의미합니다.

쿼터니언

쿼터니언은 게임 오브젝트의 방향 또는 회전을 나타내기 위해 사용할 수 있습니다. 내부적으로 (Unity에서 x, y, z, w라고 하는) 네 숫자로 표시되지만, 이 숫자는 각도나 축을 나타내지 않고 일반적인 경우 직접 액세스할 필요가 없습니다. 쿼터니언 수학에 대해서 특별한 관심이 없는 경우 쿼터니언이 3D 공간의 회전을 나타낸다는 것만 이해하면 되며, 일반적인 경우 x, y 및 z 프로퍼티를 이해하거나 수정할 필요가 없습니다.

벡터가 포지션 또는 방향(원점에서 측정되는 방향)을 나타내는 것과 같이, 쿼터니언은 방향 또는 회전을 나타낼 수 있습니다. 회전은 회전의 “원점” 또는 “Identity”로 측정됩니다. 회전은 위와 같이 한 방향에서 다른 방향으로 측정되기 때문에, 쿼터니언으로 180도보다 큰 회전을 나타낼 수 없습니다.

  • 장점: 쿼터니언 회전에는 짐벌 락 문제가 없습니다.
  • 한계: 쿼터니언 하나로 어떤 방향으로든 180도보다 큰 회전을 나타낼 수 없습니다.
  • 한계: 쿼터니언 숫자 표시는 직관적으로 이해할 수 없습니다.

Unity는 모든 게임 오브젝트 회전을 쿼터니언으로 저장하며, 이는 단점보다 장점이 더 많기 때문입니다.

이해하고 편집하기 쉽도록 트랜스폼 인스펙터에는 회전이 오일러 각으로 표시됩니다. 인스펙터에 입력하는 새로운 게임 오브젝트 회전 값은 게임 오브젝트에 대한 새로운 쿼터니언 회전 값으로 전환됩니다.

인스펙터에서 게임 오브젝트 회전은 오일러 각으로 표시 및 편집되지만 내부적으로는 쿼터니언으로 저장됩니다.
인스펙터에서 게임 오브젝트 회전은 오일러 각으로 표시 및 편집되지만 내부적으로는 쿼터니언으로 저장됩니다.

인스펙터에서 게임 오브젝트의 회전 값을 (예를 들어, X: 0, Y: 365, Z: 0로) 입력할 수 있지만, 이 값을 쿼터니언으로 나타낼 수 없으므로 Play 모드를 시작하면 게임 오브젝트의 회전 값이 X: 0, Y: 5, Z: 0으로 변경되는 부작용이 있습니다. 이는 Unity가 회전을 쿼터니언으로 전환하기 때문이며, 이는 360도 전체 회전 더하기 5도라는 개념을 이해하지 못하고 단순히 회전 결과와 동일한 방법으로 방향을 잡도록 설정하는 셈입니다.

To learn more about scripting with the Quaternion class, see the Quaternion User Manual page and the Quaternion Scripting Reference

Implications for Animation

많은 3D 저작 패키지와 Unity의 내부 애니메이션 창에서는 오일러 각을 사용하여 회전을 애니메이션 중에 지정할 수 있습니다.

이러한 회전 값은 쿼터니언으로 표시할 수 있는 범위를 벗어나는 경우가 많습니다. 예를 들어 게임 오브젝트가 720도 회전하는 경우 오일러 각을 사용하여 X: 0, Y: 720, Z:0으로 나타낼 수 있지만, 쿼터니언 값으로는 나타낼 수 없습니다.

Unity’s Animation Window

Unity의 자체적인 애니메이션 창에는 회전을 보간하는 방법을 쿼터니언 또는 오일러 보간 중에서 선택할 수 있는 옵션이 있습니다. 오일러 보간을 지정하면 Unity가 각도로 지정된 전체 동작 범위를 나타내도록 설정됩니다. 하지만 쿼터니언 회전으로 지정하면 회전이 특정 방향에서 끝나도록 설정되고 Unity는 쿼터니언 보간을 사용하여 해당 지점에 이르는 최단 거리로 회전합니다. 자세한 내용은 애니메이션 커브 사용을 참조하십시오.

External Animation Sources

애니메이션을 외부 소스에서 임포트하는 경우 파일에는 일반적으로 회전 키프레임 애니메이션이 오일러 포맷으로 포함됩니다. Unity의 디폴트 동작은 키프레임 간 회전이 쿼터니언의 유효 범위를 초과하는 상황을 방지하기 위해 애니메이션을 리샘플링하고 애니메이션의 모든 프레임마다 새로운 쿼터니언 키프레임을 생성합니다.

예를 들어 서로 6 프레임 떨어진 키프레임 2개가 있고 첫 번째 키프레임의 X 값이 0이고 두 번째 키프레임의 X 값이 270인 경우를 생각해 보십시오. 리샘플링하지 않으면 두 키프레임 사이에 쿼터니언 보간을 적용할 경우 반대 방향으로 90도 회전합니다. 그래야 첫 번째 방향에서 두 번째 방향까지 최단 거리로 갈 수 있기 때문입니다. 하지만 리샘플링하고 모든 프레임에 키프레임을 추가하면 키프레임 간 각도가 45도로 작아지므로 회전이 올바르게 작동합니다.

리샘플링을 해도 경우에 따라 쿼터니언으로 나타낸 임포트된 애니메이션이 오리지널과 충분히 유사하지 않을 수 있습니다. 그렇기 때문에 Unity 5.3 이상에는 런타임 시점에 오리지널 오일러 애니메이션 키프레임을 사용할 수 있도록 애니메이션 리샘플링을 끄는 옵션이 있습니다. 자세한 내용은 오일러 커브 회전 애니메이션 임포트를 참조하십시오.

스케일 제약
광원