본문 바로가기

예전/3D

[3D] 김벌락 (Gimbal Lock)



김벌락 ( 부제 : 오일러 각에 의한 김벌락 현상 )




1. 오일러 각

- 김벌락을 하기전에 우선 오일러 각에 대해 알아보자.

오일러 각이란 3차원 공간에 강체가 놓인 방향을 표시하기 위한 것이다. 여기서 강체란 외부의 힘에 변하지 않는 물체를 말한다.
일반적으로 x, y, z 축을 이용하며, 각각 Pitch, Yaw, Roll (피치, 야, 롤) 이라고 한다.

3차원 공간에 놓인 객체의 방향은 오일러 각을 사용해 3번의 회전을 통해 얻을 수 있다.






- 위 영상으로 축마다 회전하는 각도가 같아도, 회전을 적용하는 순서에 따라 결과가 달라지는 것을 볼 수 있다.




2. 김벌과 김벌락


- 김벌이란 단일 축에 대한 물체의 회전을 허용하는 것으로 수평 유지 장치를 말한다.

- 김벌락이란 오일러 각에서 회전 순서에 따라서 회전에 영향을 받는 축이 바뀌기 때문에 3차원 공간 상에서 두 축이 겹쳐서 한 축이 소실되는 현상을 말한다.





- 위 영상은 김벌락 현상에 대해 설명하고 있다.

초록색 김벌은 y, 분홍색 김벌은 x, 파란색 김벌은 z를 의미한다.


y를 회전하면 x와 z에 영향을 준다.

x를 회전하면 z에만 영향을 준다.


만약 x축을 많이 회전하여 z축과 y축이 일치하게 되면, 한 축이 소실되는 현상이 나타나는데 이것이 김벌락이다.


(여기서 한 축이 소실된다고 했는데, 필자는 소실되는 축을 z축이라고 보고있다.)



- 첨부된 예제를 통해 김벌락 현상을 느껴보길 바란다.



김벌락 예제.exe

김벌락 예제 사용법.txt



3. 김벌락 현상이 발생하는 이유


- 각 축별로 회전할 수 있는 가지 수는 xyz / xzy / yxz / yzx / zxy / zyx 6 가지가 있다.





- 각각 y, x, z라고 하고, 부모 계층 구조로 놓았다.

y 회전은 x 와 z 에 영향을 준다.그리고 x회전은 z축에만 영향을 준다. 


x축 회전을 많이 해서 y축과 z축이 일치하면 한 축이 소실되는 짐벌락 현상이 발생한다.


만약 이렇게 z축이 소실되면,

노란색 같은 이상한 움직임을 보이며, 이것은 의도한 화살표의 이동이 아니다.


이런 현상이 나타났을 때,

회전 순서를 y, z, x로 바꿔 적용하면, 원하는 데로 화살표가 이동한다.


하지만 y, z, x 순서라도 김벌락이 발생 할 수 있다. 순서를 바꿔 z, y, x 순서로 해도 김벌락이 발생할 수 있다.



x, y, z 에서 나올 수 있는 가지 수는 총 6가지 이다.


이 6가지 모두 김벌락이 발행할 여지가 있다. 그렇다면 어떻게 해야 할까?




4. 오일러 각으로 김벌락 현상을 회피하는 방법


- 4의 제목을 보면 없애는 방법이 아니라 , 회피하는 방법이다.

오일러 각으로는 김벌락 현상을 절대 없앨 수 없다. 오로지 회피만 가능하다는 것을 알아야 한다.



오일러 각으로 김벌락 현상을 회피하는 방법에는 여러가지가 있지만, 2가지만 보겠다. 


첫 번째로 회전의 순서를 바꾸는 방법이다.


가장 자주 쓰는 축 즉, 회전 각도가 제일 큰 축을 첫 회전 축으로 놓고,

가장 덜 쓰는. 회전 각도가 가장 작은 축을 두 번째 회전 축으로 놓고, 

나머지를 세 번째 회전 축으로 놓는다.



이렇게 하면 두 번째 축이 가장 적게 돌기 때문에 김벌락을 최대한 회피할 수 있다.


하지만, 두 번째 축 회전이 90도 혹은 270도 회전하게 되면, 첫 번째 축과 세 번째 축이 겹치는 짐벌락 현상이 일어난다. 이는 오일러 각이기 때문에 나타나는 어쩔 수 없는 현상이다.



두 번째로 임의의 축을 구해서 그 축에 대해 한번에 회전하는 것이다.


D3DXMATRIX* D3DXMatrixRotationAxis(

  _Inout_  D3DXMATRIX *pOut,

  _In_     const D3DXVECTOR3 *pV,

  _In_     FLOAT Angle

);


위 함수는 임의의 축에 Angle만큼 회전한 행렬을 return 하는 함수이다. 

하지만, 이 역시 보간 처리의 문제가 남아있기 때문에 김벌락을 완전히 회피하기 위해서는 쿼터니언을 사용해야 한다.




결론적으로, 오일러 각으로는 김벌락 현상을 완전히 회피할 수 없다 !! 




(.. 하지만 쿼터니언도 완전한 짐벌락 회피가 아니다.

쿼터니언은 곧 포스트 하겠어요~ )





[영상 출처] http://vimeo.com/2824431


문제가 있을 시 삭제하겠습니다.



'예전 > 3D' 카테고리의 다른 글

피킹참조자료 주움  (2) 2012.09.27
[UI엔진] 처음 내 프로젝트를 만들고서  (0) 2012.09.27
[3D] Direct3D 초기화  (0) 2012.09.06
[3D] 행렬  (0) 2012.08.06
[3D] 벡터  (0) 2012.08.06