[Graphics] 3D 환경에서 회전
회전은 축을 기준으로 돈다. 3차원 환경에서는 각각 x, y, z의 세 축이 있다. 이 축들을 기준으로 물체가 회전을 하게 되는데 좌표계에 따라 다르지만 D3D에서는 순서대로 y축 기준의 회전을 Yaw, x축 기준의 회전을 Pitch, z축 기준의 회전을 Roll이라고 한다.
오일러 각
2차원 공간에서는 축이 2개이기 때문에 각 축은 회전에 대한 자유도가 있지만, 3차원에서는 얘기가 다르다. 어떤 순서로 회전을 하느냐에 따라서 같은 회전량이더라도 전혀 다른 결과물을 가지고 온다.
두 가지의 경우를 예로 들어보자. 우선 x축을 회전축으로 하여 +90도, 이후 y축을 회전축으로 하여 +90도를 회전한 결과이다.
그 다음은 y축을 회전축으로 하여 +90도, 이후 x축을 회전축으로 하여 +90도를 한 결과물이다.
이처럼 분명히 같은 회전량이지만 순서에 따라 결과물이 전혀 다르게 나온다. 때문에 회전하는 세 개의 각도의 순서를 정하여 강체의 자세를 나타내는 것이 바로 오일러 각이다.
상기 설명한 YawPitchRoll은 그런 오일러각의 순서 중 하나로 y축 회전 -> x축 회전 -> z축 회전의 순서로 축의 회전이 이뤄진다.
하지만 오일러 각에는 크나큰 단점이 있는데 바로 짐벌락이다.
짐벌락은 회전을 할 때, 각 축의 회전이 동시에 일어나는 것이 아니라 순서대로 일어나는 것이기 때문에 발생하는 충돌 현상으로 두 번째 회전에서 일어나는 현상이다.
각 축이 x, y, z의 회전축이며, 이 형태가 짐벌처럼 이뤄져 있다. 각 고리는 자신의 축을 기준으로만 회전하는데, 단일축으로 회전함에도 파란 고리가 모든 방향으로 회전하는 것처럼 보이는 이유는 고리들이 서로 연결되어 있다. 세 축은 서로 종속적이기 때문에 한 축의 회전이 다른 축에 영향을 준다.
이 경우, 회전축이 서로 겹치는 상태가 발생할 수 있는데 이것이 바로 밑의 그림이다. 이 상황을 짐벌락이라고 표현한다.
짐벌락은 오일러각이 가지는 한계점으로 이는 앞서 설명했듯이 오일러각이 각 축의 회전에 대한 계산이 동시적이 아니라 순서대로 이뤄지기 때문이다.
이를 해결하기 위해 쿼터니언 회전이 고려되었다. 기존에 회전에 사용되던 행렬을 대신하는 수학적 개념이며, 사원수 혹은 쿼터니언이라고 부른다.
비교 항목 | 행렬 | 쿼터니언 |
데이터량 | float 16개 | float 4개 |
연산 속도 | float 곱셈 16 * 16회 | float 곱셈 16회 |
특징 | 짐벌락 등의 오류 발생 확률 존재 | 최단호 보간으로 오류 발생률이 적음 |
위의 표로 확인이 가능한 것처럼 쿼터니언은 행렬에 비해 연산 속도가 빠르고, 차지하는 메모리의 양도 적으며, 결괴의 질에 있어 오류가 날 확률이 적다.
쿼터니안에 대한 정보는 더 방대하나 아직 정리가 되지 않아서 글로 옮기기엔 무리가 있다고 생각된다. 추후 그래픽스에 대한 공부가 더 충족되고 나면 이어서 작성하기로 했다.