티스토리 툴바



2007/10/18 00:24

쿼터니언에 대해서... 이동성분에 대해서..

수학적인 부분에서 접근하는 쿼터니언은 솔직히 아무리 봐도 잘 모르겠다.

모 대충 보면 오일러로 회전을 표현하다 보면 짐벌락 현상이 생기게 되고,
쿼터니언은 생기지 않는다. 이런말도 있다.

쿼터니언은 x, y, z 의 임의의 축과 angle로 이루어져 있다고 한다.

더 가다 보면..
항등 쿼터니언.. 모 행렬로 변환하는 방법 등등..
참 많다. -.-
근데 오픈지엘에서 특정 쿼터니언을 사용해서 어떤 값을 넣으면
어떻게 변한다.

모 이런건 잘 없는거 같다.

왜 프로그래밍 하다 보면.. 솔직히 모 수학적인 개뿔 이런거 보다 ^^
한줄의 코딩이 더 좋은법 아닌가..

쿼터니언 몇줄로 테스트를 해보았다.

CQuat quat = CQuat(90, 1, 0, 0);
이것을 하게 되면 x 축을 90도 돌린 것이다.
이 클래스에는 아래와 같은 GetDirectionVector() 함수가 존재 한다.
quat3.GetDirectionVector(x, y, z);
이걸 가지고.. 이동값에 특정값을 더해주면..
x축으로 90도 돌린 위치로 이동하게 된다.
대충 말해서.. x축으로 90도 돌렸으니 y 축이 되는 것이다. (이해가 가는가?)
 static float pos[3] = {0, 0, 0};
 pos[0] += x * 0.1;
 pos[1] += y * 0.1;
 pos[2] += z * 0.1;
 glTranslatef(pos[0], pos[1], pos[2]);

다르게 해보자.

 CQuat quat = CQuat(45, 1, 0, 0);
 CQuat quat2 = CQuat(45, 1, 0, 0);
 CQuat quat3;
 quat3.MultAndSet(quat, quat2);
이렇게 두개의 쿼터니언을 곱하게 되면 어떻게 될까?.
CQuat quat3 = CQuat(90, 1, 0, 0);
과 같은 현상이 발생된다.

다른 함수를 더 사용하면..

CQuat quat = CQuat(45, 1, 0, 0);
CQuat quat2 = CQuat(45, 1, 0, 0);
quat2.PostMult(quat);
이렇게 하면 quat2는 90, 1, 0, 0 의 값을 입력한 것과 같게 된다.

이동성분에 대해서만 해봤다.
회전도 담에는 해보자.

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0