쿼터니언(Quaternion) 이란?
게임 오브젝트(GameObject)에 필수적으로 존재하는
Transform 컴포넌트에는 각각 위치(position), 회전(rotation),
크기(scale)를 구성하는 속성들이 존재한다.
여기서 우리가 유심히 봐야 할 점은 위치와 크기는
벡터(vector) 형식의 값을 가지는 반면
회전은 그 값을 표현하는 방식이 다르다
바로, 쿼터니언(Quaternion) 형식의 값을
가진다는 사실이다.
하지만 문제점은 쿼터니언 형식의 값은
사람이 한눈에 봐도 쉽게 알아볼수가 없는데
이러한 문제점을 해결하여 나온것이
바로 오일러 각도(Euler Angles)다.
오일러 각도는 총 3개의 각으로
직관적으로 "사람이 읽을 수 있는" 형식을 갖으며
180도 이상의 회전을 통해 한 방향에서 다른 방향
으로의 회전을 나타낼 수 있다.
45도 각도를 각각의 기준으로 구하였을 때
Quaternion angle = Quaternion.Euler(new Vector3(0.0f, 0.0f, 45.0f));
Debug.Log($"Quaternion = {angle}");
Debug.Log($"Euler = {angle.eulerAngles}");
출력 결과
Quaternion = (0.0, 0.0, 0.4, 0.9)
Euler = (0.0, 0.0, 45.0)
그럼, "왜 굳이 보기에도 어렵고 활용하기도 어려운
쿼터니언을 쓸까?"라고 생각할 수도 있지만
오일러 각도에는 치명적인 단점이 있다
바로, 짐벌 락(Gimbal Lock)이라는 현상이다.
짐벌락 현상(Gimbal Lock) 이란?
짐벌 락은 간단히 말해, 축과 축이 겹쳐 더 이상
회전이 불가능한 상태를 말한다


위의 사진에서도 알 수 있듯이, 두 개의 축이 겹쳐
한축에 대한 계산이 불가능해진다.
이러한 짐벌 락 현상이 생기는 이유는
오일러 각에서 자체적으로 설정되어있는
순서로 해당 축들을 개별적으로 개산 하기 때문이다
세 개의 축을 동시에 계산하지 않고 독립적으로
판단하기에 이러한 짐벌 락 현상이 일어나는 것이다
사실 2D로 개발할 때에는 오일러 각으로 각도를 구해도
문제가 없지만, 3축의 모든 각도를 개산 하는 3D 게임
같은 경우는 오일러 만으로 각을 계산하는 데엔 한계가 있다.
활용 방안
그렇다고 해서 오일러 각도는 아예 안 쓰이는 것이 아니다.
때로는 각도를 확인하고 싶을 때, 오일러 각도를
이용하여 디버깅을 하거나 이 외에도 다양한
곳에서 활용될 수 있다
많이 사용되는 Quaternion에 대한 프로퍼티나
함수들을 아래에 정리해두자면
- Quaternion.identity : 쿼터니언의 기본 값으로 "회전 없음"을 의미한다, 부모 객체가 존재할 때는 부모 축으로 정렬
- Quaternion.Euler : 인자를 통해 오일러 각을 쿼터니언 형식의 값으로 반환함
- Quaternion.AngleAxis : 회전의 기준이 되는 축(Axis)과 각을 인자로 받아 쿼터니언 형식의 회전량 정보를 반환 받음
- Quaternion.LookRotation : 마찬가지로 회전에 기준이 되는 축과 방향을 매개변수로 전달하여 회전 값을 반환 받음
이 외에도 Atan2, Acos, Asin 등 각도를 구하는 방법은 다양하니 관련된
정보를 얻고자 한다면 구글링이나 아래 래퍼런스 사이트 주소에 있는
유니티 공식 홈페이지에서 정보를 얻길 바란다.
레퍼런스 사이트
https://docs.unity3d.com/kr/530/Manual/QuaternionAndEulerRotationsInUnity.html
유니티 - 매뉴얼: Rotation and Orientation in Unity
임의의 게임 플레이 요소 추가 Rotation and Orientation in Unity Summary Rotations in 3D applications are usually represented in one of two ways, Quaternions or Euler angles. Each has its own uses and drawbacks. Unity uses Quaternions internally,
docs.unity3d.com
https://www.youtube.com/watch?v=zc8b2Jo7mno&t=129s
'Unity > 지식' 카테고리의 다른 글
[Unity] 좌표계 에 대해 알아보자 (0) | 2022.01.13 |
---|---|
[Unity] 메인 루틴과 서브루틴, 코루틴(Co-routine) 에 대해 알아보자 (0) | 2022.01.11 |
[Unity] Attribute 에 대해 알아보자 (0) | 2021.12.21 |
[Unity] 라이프 사이클(Life Cycle) 에 대해 알아보자 (0) | 2021.12.20 |
[Unity] Delta Time 에 대해 알아보자 (0) | 2021.12.19 |