프로그래밍/공부

[Graphics] 3D 환경에서 회전

Sik.K 2023. 5. 16. 23:45

 

회전은 축을 기준으로 돈다. 3차원 환경에서는 각각 x, y, z의 세 축이 있다. 이 축들을 기준으로 물체가 회전을 하게 되는데 좌표계에 따라 다르지만 D3D에서는 순서대로 y축 기준의 회전을 Yaw, x축 기준의 회전을 Pitch, z축 기준의 회전을 Roll이라고 한다.

 

출처 - Kinect Joint Rotation – The Definitive Guide - CodeProject

 

오일러 각

 

2차원 공간에서는 축이 2개이기 때문에 각 축은 회전에 대한 자유도가 있지만, 3차원에서는 얘기가 다르다. 어떤 순서로 회전을 하느냐에 따라서 같은 회전량이더라도 전혀 다른 결과물을 가지고 온다.

 

3차원 좌표계, 출처 - [동역학] 오일러 각(Euler angle) (tistory.com)

 

두 가지의 경우를 예로 들어보자. 우선 x축을 회전축으로 하여 +90도, 이후 y축을 회전축으로 하여 +90도를 회전한 결과이다.

 

출처 - [동역학] 오일러 각(Euler angle) (tistory.com)

 

그 다음은 y축을 회전축으로 하여 +90도, 이후 x축을 회전축으로 하여 +90도를 한 결과물이다.

 

출처 - [동역학] 오일러 각(Euler angle) (tistory.com)


이처럼 분명히 같은 회전량이지만 순서에 따라 결과물이 전혀 다르게 나온다. 때문에 회전하는 세 개의 각도의 순서를 정하여 강체의 자세를 나타내는 것이 바로 오일러 각이다.

 

상기 설명한 YawPitchRoll은 그런 오일러각의 순서 중 하나로 y축 회전 -> x축 회전 -> z축 회전의 순서로 축의 회전이 이뤄진다.

 

하지만 오일러 각에는 크나큰 단점이 있는데 바로 짐벌락이다.

 

짐벌락은 회전을 할 때, 각 축의 회전이 동시에 일어나는 것이 아니라 순서대로 일어나는 것이기 때문에 발생하는 충돌 현상으로 두 번째 회전에서 일어나는 현상이다.

 

출처 - 짐벌락과 오일러 각 (gimbal lock, euler angles) (tistory.com)

 

 

각 축이 x, y, z의 회전축이며, 이 형태가 짐벌처럼 이뤄져 있다. 각 고리는 자신의 축을 기준으로만 회전하는데, 단일축으로 회전함에도 파란 고리가 모든 방향으로 회전하는 것처럼 보이는 이유는 고리들이 서로 연결되어 있다. 세 축은 서로 종속적이기 때문에 한 축의 회전이 다른 축에 영향을 준다.

 

이 경우, 회전축이 서로 겹치는 상태가 발생할 수 있는데 이것이 바로 밑의 그림이다. 이 상황을 짐벌락이라고 표현한다.

 

 

짐벌락은 오일러각이 가지는 한계점으로 이는 앞서 설명했듯이 오일러각이 각 축의 회전에 대한 계산이 동시적이 아니라 순서대로 이뤄지기 때문이다.

 

 

 

 

 

 

 

 

이를 해결하기 위해 쿼터니언 회전이 고려되었다. 기존에 회전에 사용되던 행렬을 대신하는 수학적 개념이며, 사원수 혹은 쿼터니언이라고 부른다.

 

비교 항목 행렬 쿼터니언
데이터량 float 16개 float 4개
연산 속도 float 곱셈 16 * 16회 float 곱셈 16회
특징 짐벌락 등의 오류 발생 확률 존재 최단호 보간으로 오류 발생률이 적음

 

위의 표로 확인이 가능한 것처럼 쿼터니언은 행렬에 비해 연산 속도가 빠르고, 차지하는 메모리의 양도 적으며, 결괴의 질에 있어 오류가 날 확률이 적다.

 

쿼터니안에 대한 정보는 더 방대하나 아직 정리가 되지 않아서 글로 옮기기엔 무리가 있다고 생각된다. 추후 그래픽스에 대한 공부가 더 충족되고 나면 이어서 작성하기로 했다.