[Unity] 짐벌락과 오일러 각 그리고 쿼터니언

✍️ 짐벌락

  • 짐벌이란 단일 축을 중심으로 물체가 회전할 수 있도록 만들어진 구조물이다.

https://ko.wikipedia.org/wiki/%EC%A7%90%EB%B2%8C

  • 각각의 고리는 고유한 축을 기준으로 회전하는데 이는 가장 바깥쪽 고리만 해당할 뿐 안쪽 고리들은 여러 방향으로 회전함을 알 수 있다.
  • 안쪽 고리가 여러 방향으로 회전하는 이유는 고리가 종속 관계를 형성하기 때문이다. 즉 한 고리의 회전이 안쪽 고리의 회전에 영향을 주며 고리의 회전으로 인해 의도치 않게 두 개 이상의 고리가 겹치게 되면 한 축의 회전각이 소실되는데 우리는 이것을 짐벌락이라 한다.

https://en.wikipedia.org/wiki/Gimbal_lock

  • 녹색 고리의 회전으로 인해 분홍색 고리와 파란색 고리가 겹치게 되면 두 고리의 회전은 동일한 결과를 낳게 되면서 자연스럽게 한 축의 회전은 소실된다.

 

🍊 오일러 각

  • 오일러 각이란 3차원 공간에서 강체의 방향을 표현하는 수학적 표현법으로 3차원 공간에서 강체의 위치를 x, y, z 좌표로 표현하듯 강체의 방향을 x, y, z 축의 회전량으로 표현한다.

  • 오일러 각에서 사용되는 세 개의 축은 서로 종속인 관계를 갖는다. 예를 들어 x축을 회전하면 y축과 z축이 회전하고 y축을 회전하면 x축 z축이 회전한다.

https://commons.wikimedia.org/wiki/File:Euler2a.gif

 

  • 세 축은 왜 종속적일까? 의문이 생긴다면 그 답은 오일러 각을 계산하는 방법에 있다. 오일러 각은 회전을 세 번에 나눠서 순차적으로 계산하기 때문이다.
    • 어떤 강체 A를 x축에 대해 회전하면 A'의 방향을 갖는다. 이후 y축에 대해 회전하면 A'에 대한 회전으로 A''의 결과를 낳는다. 마찬가지로 Z축에 대해 회전하면 A'''의 결과를 가져온다. 이처럼 한 축에 대한 회전이 결코 독립적인 결과를 가져올 수 없다.
  • 결국 이전에 설명한 짐벌처럼 오일러 각은 한 축의 회전이 다른 축에 종속적이므로 짐벌락 문제에 놓여있다. 
  • Unity 2D에선 오일러 각을 사용해도 문제가 없지만 x,y,z 세 축을 모두 사용하는 3D 환경에선 오일러 각을 사용하는 것은 한계가 있다. 이러한 오일러 각의 문제를 해결하기 위해 나온 것이 바로 쿼터니언(Quaternion)이다. 

 

📝 쿼터니언

  • 유니티는 인스펙터 뷰에 강체의 방향을 보다 직관적으로 조작할 수 있도록 오일러 각으로 표현하고 있다. 하지만 내부적으로 쿼터니언 방식으로 강체의 방향을 표현하니 개발자가 의도적으로 오일러 각을 사용하도록 유도하지 않으면 유니티에서 짐벌락 현상은 발생하지 않는다.  

  • 쿼터니언은 복소수를 확장한 x, y, z, w 성분을 갖는 4차원 벡터로 세 개의 축을 동시에 회전시켜 축에 대한 종속 관계를 없앴으며 하나의 축이 소실되는 문제점을 방지할 수 있다.

  • 쿼터니언의 장점 
    • 짐벌락 문제가 발생하지 않는다.
    • 계산 비용이 적다.
  • 쿼터니언의 한계점
    • 직관적이지 않다... 원리를 이해하지 못하면 쿼터니언을 사용할 수 없다. 다행히도 유니티에선 Vector3를 넘겨주면 쿼터니언으로 바꿔주는 메서드가 존재한다.
    • 회전을 하나의 방향에서 다른 방향으로 측정하기 때문에 180도 보다 큰 회전을 표현할 수 없다.