Unity에서는 게임 오브젝트의 회전을 표현하는 데에 오일러각과 쿼터니언을 모두 사용할 수 있습니다.
오일러각(Euler Angle)
오일러각은 게임 오브젝트의 회전을 각각의 축(x, y, z)을 기준으로 각도를 나타내는 방식입니다. Unity에서는 Transform 컴포넌트의 Euler Angles 속성을 통해 오일러각을 조작할 수 있습니다.
오일러각의 문제점
오일러 각도는 피치, 요 및 롤의 세 가지 각도를 사용하여 3D 공간에서 객체의 방향을 나타내는 방법입니다. Unity에서 오일러 각도는 일반적으로 게임 개체의 회전을 지정하는 데 사용됩니다. 그러나 오일러 각도를 사용하여 회전을 나타내는 데 짐벌 잠금(gimbal lock)이라고 하는 문제가 있습니다.
짐벌 잠금은 3개의 오일러 각 중 2개가 정렬되어 자유도가 1 감소하고 특정 방향을 표시할 수 없게 될 때 발생합니다. 이는 두 축이 정렬되면 두 축을 중심으로 한 회전이 동일해져서 두 축을 구별할 수 없기 때문입니다.
Unity에서 짐벌 잠금은 개체를 회전할 때 예기치 않은 동작을 유발할 수 있습니다. 예를 들어 개체를 x축을 중심으로 90도 회전한 다음 y축을 중심으로 90도 회전한 다음 z축을 중심으로 회전하려고 하면 개체가 대신 다른 축을 중심으로 회전하는 것처럼 보입니다.
짐벌 잠금을 방지하기 위해 Unity는 쿼터니언 또는 행렬 변환을 사용하는 등 회전을 나타내는 대체 방법을 제공합니다. 쿼터니언은 짐벌 잠금 문제를 방지하고 회전 사이에 부드러운 보간을 허용하므로 회전을 나타내는 보다 효율적이고 신뢰할 수 있는 방법입니다.
쿼터니언(Quaternion)
쿼터니언은 회전을 나타내는 4차원 벡터입니다. Unity에서는 Transform 컴포넌트의 rotation 속성을 통해 쿼터니언을 조작할 수 있습니다.
오일러각과 쿼터니언의 차이점
오일러각과 쿼터니언의 가장 큰 차이점은 회전을 나타내는 방식입니다. 오일러각은 축을 기준으로 회전을 나타내는 반면, 쿼터니언은 축 자체가 회전하는 것을 나타냅니다. 이러한 차이점 때문에 쿼터니언은 회전 순서에 대한 문제가 발생하지 않으며, 보간 등의 연산에서도 더욱 정확한 결과를 얻을 수 있습니다.
쿼터니언 메서드
Unity에서는 쿼터니언을 다루기 위해 다양한 메서드를 제공합니다
Quaternion.Euler
public static Quaternion Euler(float x, float y, float z);
public static Quaternion Euler(Vector3 euler);
오일러각을 쿼터니언으로 변환합니다. 오일러각을 입력으로 받아 해당하는 쿼터니언을 반환합니다.
Quaternion.LookRotation
public static Quaternion LookRotation(Vector3 forward);
public static Quaternion LookRotation(Vector3 forward, Vector3 upwards);
주어진 방향 벡터를 바라보는 회전을 나타내는 쿼터니언을 반환합니다. upwards를 지정하면 해당 방향 벡터가 가리키는 방향을 위로 하는 회전을 반환합니다.
Quaternion.Slerp
public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
두 쿼터니언을 구형 선형 보간합니다. t값이 0일 때 a를, 1일 때 b를 반환합니다.
Quaternion.Angle
public static float Angle(Quaternion a, Quaternion b);
두 쿼터니언 간의 각도 차이를 반환합니다.
Quaternion.AngleAxis
public static Quaternion AngleAxis(float angle, Vector3 axis);
주어진 축을 기준으로 주어진 각도만큼 회전하는 쿼터니언을 반환합니다.
Quaternion.Dot
public static float Dot(Quaternion a, Quaternion b);
두 쿼터니언의 내적(dot product)을 반환합니다. 두 쿼터니언이 얼마나 비슷한지를 나타내는 값입니다.
Quaternion.Inverse
public void Inverse();
쿼터니언의 역수를 반환합니다.
Quaternion.Lerp
public static Quaternion Lerp(Quaternion a, Quaternion b, float t);
두 쿼터니언을 선형 보간합니다. t값이 0일 때 a를, 1일 때 b를 반환합니다.
Quaternion.RotateTowards
public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);
주어진 두 쿼터니언 사이에서 maxDegreesDelta만큼 회전합니다.
Quaternion.ToAngleAxis
public void ToAngleAxis(out float angle, out Vector3 axis);
쿼터니언을 주어진 축과 각도로 변환합니다.
예시
// 쿼터니언 생성
Quaternion q1 = Quaternion.Euler(0, 45, 0);
Quaternion q2 = Quaternion.AngleAxis(45, Vector3.up);
Quaternion q3 = Quaternion.LookRotation(Vector3.forward, Vector3.up);
// 쿼터니언 연산
Quaternion q4 = q1 * q2;
Quaternion q5 = Quaternion.Slerp(q1, q2, 0.5f);
// 오일러각으로 변환
Vector3 euler = q1.eulerAngles;
// 쿼터니언 메서드 사용
float angle = Quaternion.Angle(q1, q2);
Vector3 axis;
Quaternion.FromToRotation(Vector3.up, Vector3.forward).ToAngleAxis(out angle, out axis);
'Unity' 카테고리의 다른 글
Unity Collider 컴포넌트 (0) | 2023.03.23 |
---|---|
Unity 수학 함수 Mathf (0) | 2023.03.22 |
Unity에서 게임 오브젝트 회전하는 방법 (0) | 2023.03.19 |
Unity에서 게임 오브젝트 위치 이동 시키기 (0) | 2023.03.18 |
연산자란? 연산자 종류 - 단항 연산자, 이항 연산자, 삼항 연산자 (0) | 2023.03.16 |