[Graphics] Mathematical Concepts

[Quaternion] 회전 시 오일러 대신 쿼터니언 사용 이유

doyyy_0 2024. 12. 25. 14:03

본 개념은 홍정모 교수님의 강의를 거의 그대로 인용한 것 입니다. 자세한 내용은 홍정모 연구소 그래픽스 새싹코스 Part3를 구매하시고 들으시면 됩니다.

 

 

 

3차원 개념에서는 회전 각도가 3가지가 있습니다. x축 기준회전, y축 기준 회전, z축 기준 회전이 있습니다.

오일러의 3차원 자유변수(x,y,z축 각각의 회전 변수를 각 자유변수라고 함)를 행렬로 표현하면 다음과 같습니다.(단, x축 기준 회전 각도는  α, y축 기준 회전 각도는β, z축 기준회전 각도는 γ)

 

행렬로 표현하면 다음과 같습니다.

 

여기서 최종행렬은 α, β로 표현이 되죠? 따로따로 표현이 되어야 자유변수로서 성립이 되는데 α+ γ 로 합쳐져서 자유변수로서 성립이 안됩니다. 즉  α, γ 중 어떤 각도를 변환해도 어느 것을 변환했는지 구분이 안된다는 것이죠. 예를들어 β 각도를 90에 가깝게 설정 했을때,  α 를 돌리든 γ  를 돌리든 같은 방향으로 돌아갈 수도 있다는 것입니다.

 

이러한 문제를 해결하기 위해 등장한 것이 쿼터니언 방식입니다. 쿼터니언 방식은 복소수를 활용합니다.

 

1) 쿼터니언 표현

쿼터니언은 z= a+bi로 실수와 허수부분으로 나뉩니다.
허수부분은 벡터이고 실수부분은 스칼라입니다.
p = (u,w)에서 u는 벡터이고 w는 스칼라이다
따라서 (u,w) = (u+w)로 나타낼 수 있고 정리하면
(xi+yj+zk +w)로 나타낼 수 있습니다.(단, u=xi+yj+zk)

 

2) 쿼터니언 계산

쿼터니언 더하기는 (u,a) + (v,b) = (u+v,a+b) (단, u와v는 벡터, a와 b는 스칼라) 이렇게 표현될 수 있고 

곱하기는 다음과 같이 계산합니다. 그냥 결과를 공식으로 알고 쓰면 됩니다.

 

 

3) 절대값 계산

=> 쿼터니언으로 회전을 구한할 때는 반드시 Normalize를 하고 사용해야합니다.

 

4) 역 계산

5) 최종 회전

 

directx에서 사용할 때는 오일러각을 쿼터니언 행렬을 다음과 같이 표현할 수 있습니다.

//오일러 회전 행렬
m_mainSphere.UpdateModelWorld(Matrix::CreateRotationX(m_eulerAlpha) *
                              Matrix::CreateRotationY(m_eulerBeta) *
                              Matrix::CreateRotationZ(m_eulerGamma) *
                              Matrix::CreateTranslation(translation));

//쿼터니언 회전 행렬
 Vector3 n = Vector3(m_quatX, m_quatY, m_quatZ);
 Quaternion q(n * sin(m_quatTheta / 2.0f), cos(m_quatTheta / 2.0f));
 q.Normalize();
 m_mainSphere.UpdateModelWorld(Matrix::CreateFromQuaternion(q) *
                               Matrix::CreateTranslation(translation));

 

강의 출처 : 홍정모 그래픽스 새싹코스 Part3 (쿼터니언과 회전 이론, 쿼터니언과 회전 실습)

https://honglab.co.kr/

 

honglab

Introduction to Computer Graphics with DirectX 11 - Part 4. Computer Animation Course • 102 lessons [그래픽스 Part4 - 컴퓨터 애니메이션] 파트1,2,3에서 배운 내용들로 이번에는 요소 기술들이 따로따로 작동하도록 구

honglab.co.kr