(이스님글)
짐벌락(gimbal lock)
짐벌락이란 무엇이며 왜 이러한 현상이 일어나는가?
짐벌락이란 무엇인가? 짐벌락은 같은방향으로 오브젝트의 두 회전 축이 겹치는 현상을 말합니다. 간단히 설명하면 여러분의 오브젝트가 여러분이 회전하려고 하는 방향으로 오브젝트가 회전하지 않는것입니다.
짐벌락은 모든 그래픽아티스트들이 가끔 작업중에 직면하게 되는 아주 당혹스러운 문제들이며 항상 최악의 상황에서 일어납니다.
짐벌락은 오일러 앵글이라고 알려진 회전 행렬로 오브젝트를 애니메이트 하려고 할 때 발생합니다. 이것은 회전행렬을 사용할시에 여러분이 주의해야할 제약사항입니다.
오일러 앵글을 사용하는 시스템들(마야,Max,Lightwave,softimgage)에서는 이러한 짐벌락문제를 가집니다.
이것이 생기는 이유는 오일러 앵글이 설정한 순서에 각 축을 독립적으로 평가하기 때문입니
다.
3DS Max는 회전순서가 X,Y,Z로 되어있습니다. 물론 이 순서는 여러분이 원하기만 하면
변경이 가능합니다. 어찌 됐든 X,Y,Z로 회전순서가 돼어있다는 것은 먼저 X축으로 오브젝트를 회전시키고 그 다음 Y축으로 회전하고 마지막으로 Z축으로 회전한다는 의미입니다.
이때 여러분이 Y축을 90도로 회전할 때 짐벌락이 발생합니다.
왜냐하면 X 성분이 이미 평가가 됐기 때문에, 다른 두축으로 이동되지 않습니다.
이렇게 되면 X와 Z축이 서로 같은 축을 향해 가리키게 됩니다.
여러분이 오일러 앵글을 사용한다면 여러분은 짐벌락 문제를 항상 염두해 두어야만 합니다.
오일러 앵글을 사용하면서 얻어지는 장점은 오일러 앵글을 사용하면 쿼터니언 회전보다 그래픽 아티스트들이 이해하기가 매우 쉽다는 점입니다.
쿼터니언 회전은 훨씬 더 강력하며 튼튼합니다.
Max에서 ,TCB 컨트롤러는 방향을 구하기 위해서 쿼터니언 수학을 사용합니다.
쿼터니언 회전은 얼마큼 회전하는지를알려주는 행렬을 위해 4개의 값과 회전하려고 하는 방향을 구하기 위해 동시에 세개의 축을 평가합니다.
이렇게 쿼터니언을 사용하면서 얻는 이점은 여러분은 짐벌락에 대한 문제에
더 이상 고민하지 않아도 된다는 것입니다.
쿼터니언은 세개의 축이 동시에 업데이트 되기 대문에 짐벌락이 일어나지 않습니다.
물론 단점이 있는데 쿼터니언을 사용하게 되면 오일러 앵글보다 이해하기가 훨씬 더 복잡해지며 개념화하기가 어렵다는것입니다.
max에서 회전 스크립트 컨트롤러는 오일러 앵글보다 훨씬 더 강력하게 해주는 쿼터니언 회전이다. 그러나 쿼터니언은 사용하기가 어려우며 이해하기가 매우 어렵다.
나는 대개 코드에서 오일러 앵글을 사용했다 왜냐하면 이해하기가 쉬우며 애니메이트 시키기가 편하기 때문이다.
여러분은 그냥 오일러 앵글을 로컬 오일러, 월드 오일러,XYZ 베지어 등등 모로 부르던간에
심각한 제약사항이 있다는 것만을 기억해주기 바란다.
다음의 내용들은 여러분이 오일러 앵글을 가지고 작업할 때 잘못된 길로 가지 않도록 기억해야할 몇가지 사항들에 대해서 설명한 것이다.
1. 여러분의 오브젝트가 단지 한축에 대해서 회전한다면, 대응되는 축의 순서를 변경해라. 예를 들어 여러분이 Y축에 대해서 회전한다면 회전순서를 Y,Z,X로 한다.
2. 여러분이 두 축에 대해서 회전한다면, 첫번째와 마지막 축에 관련된 축의 순서를 변경해라. 예를 들어, 여러분의 X와 Y축을 회전한다면 축의 순서를
X,Z,Y로 변경한다.
3. 여러분이 세개 축에 대해서 회전한다면 짐벌락이 발생한다는 사실에 주의해야 한다.
문제가 일어나지 않는 방향으로 변경해라. 또는 첨가 노드(이것이 필요없을지라도)
를 사용해서 축을 구별해라.
4. 특정한 경우에서, 오브젝트의 부모가 실제로 짐벌락이 발생할수 있다.
이때는 오브젝트를 이러한 두 노드사이에 체인으로 쿼터니언 노드로 대체한다.
여러분은 바이패드로 오일러 앵글을 사용해서 어떤 것을 링크하려고 한다면 3D맥스에서 이것의 좋은 예졔를 볼수 있을것이다.
즉시 짐벌락이 발생한다.
한가지 해결책은 먼저 바이패드된 더미를 TCB 컨트롤러(쿼터니언)에 링크시키는것이다.
그때 여러분의 체인을 더미에 링크시키는것이다.
5. 평가되는 첫번째 축은 항상 오브젝트의 로컬 좌표 방향에서 일어난다.
6. 평가되는 마지막 축은 일반적으로 월드 좌표 방향에서 일어난다.
신중한 설계와 미리 약간의 생각을 한다면 여러분은 짐벌락 문제를 최소한으로 줄일수 있을것이다. 즐거운 애니메이션을 하세여..
===================================================================================================================
출처 - http://supercms.woweb.net/spboard/board.cgi?id=qna&action=simple_view&gul=328-1
GPG에 너무 좋은 답변 있어 복사를 해서 갖다 붙입니다.^-^
//아래가 답변
GameDev.net의 quaternion power article 에 나와 있는 예제 프로그램
실행해 보시면 단박에 이해가 가실겁니다.
이 예제 프로그램은 오일러 각으로 회전을 표현했을 경우입니다.
yaw(y축 회전각)을 90로 고정시키고 pitch(x축), roll(z축) 회전을 실시했을 경
우 pitch 와 roll 회전이 같은 방향으로 회전하게 됩니다(이것이 gimbal lock).
오일러 각으로 회전을 표현할경우 전체 회전행렬 = z축 회전행렬 * y축 회전행
렬 * x축 회전행렬 과 비슷한 순서의 회전행렬(회전행렬의 순서는 사용자 임의
로 바꿀수 있으며 이때 gimbal lock 되는 축도 그에 따라 바뀜)을 사용하게 되는
데 이때 yaw각을 90도로 회전시켰을 경우(회전행렬의 순서상) x축이 -z축이 되
어 x축회전을 하나마 나한 상태가 됩니다.
---------------------------------------------------------------------------
카메라 두개를 실행시켜 확인하시면 확실히 이해가되실겁니다.
'Programming > 물리엔진/게임엔진' 카테고리의 다른 글
물리엔진을 간단하게 체험 해 보기 (0) | 2013.02.03 |
---|---|
OpenGL의 기본 기능만을 이용해 만든 게임 (0) | 2013.01.29 |
쿼터니온을 Yaw, Pitch, Roll 로 뽑기 (0) | 2013.01.29 |
캡슐 형태와 점, 구의 충돌 체크 (0) | 2013.01.29 |
구와 박스(OBB 또는 AABB)의 충돌체크 (0) | 2013.01.29 |