블로그 이미지
이태원에서 사는 다섯식구의 무직 가장. 흰둥에미

카테고리

분류 전체보기 (184)
Itaewon (2)
ryu's?? (1)
20121210이전 (20)
20130827이전 (147)
soo'study (13)
Total41,314
Today0
Yesterday6

짐벌락.

오일러의 공식을 이용해 회전 변환이 이루어질 시, x, y, z 세 축에 대해 각각의 회전을 조합하게 된다.

따라서 연산 순서에 따라 한 축의 90도 회전에 의해 두 축이 겹쳐, 한 축의 자유도를 잃게 됨(즉 겹친 두축의 회전이 동일하게 됨)

(여기서 축이란 회전 축을 의미)

수학적으로는 아무 문제 없는 결과이지만, 3차원상에서의 좌표변환에 문제가 생김.


해결법.

1. 방법으로서는 가장 손쉬운 쿼터니언(사원수)을 사용하면 됨.(물론 수학적 이해나, 실제 증명, 계산은 골 때림)

FLOAT                        fAngleX;

FLOAT                        fAngleY;

FLOAT                        fAngleZ;

D3DXMATRIXA16          matRot;

D3DXQUATERNION       qtRot;

D3DXQuaternionRotationYawPitchRoll(&qtRot, fAngleY, fAngleX, fAngleZ);

D3DXMatrixRotationQuaternion(&matRot,&qtRot);

SetTransform(D3DTS_WORLD, &matRot);


2. 또는 각 오브젝트가 스스로 x, y, z의 베이스 벡터를 지니고, 회전에 따라 베이스 벡터를 갱신해주는 방법이 있음.

Yaw가 변경시, Z축의 벡터를 회전 시키고, Z와 변하지 않는 Y축의 외적을 이용해 X축을 새로 구해줌.

Pitch 변경시, Z축의 벡터를 회전 시키고, Z와 변하지 않는 X축의 외적을 이용해 Y축을 새로 구해줌.

Roll 변경시, X축의 벡터를 회전 시키고, X와 변하지 않는 Z축의 외적을 이용해 Y축을 새로 구해줌.

(회전의 기준이 되는 축은 변경되지 않으므로, 변경될 두 축 중 하나만 회전에 의한 값을 구하고, 다른 한 축은 외적을 이용해 구함,

 두 축 모두 회전을 이용해 구하다 보면, 오차가 누적되어 두 축의 각이 PI/2가 아니게 됨)


단, 1번은 월드 좌표 축 기준으로 회전한 각을 적용하고,

     2번은 현재 베이스 벡터를 기준으로 회전한 각이 적용되게 구현하면 됨.?? 말이 어렵다.. 해보면 알꺼임.


그 외에도 피하는 법들이 있는데 예외 처리 귀찮으니 패스함.


'20130827이전 > DX' 카테고리의 다른 글

3D 피킹 정리  (0) 2013.04.30
3D Picking  (0) 2013.04.07
짐벌락과 그 해결.  (0) 2013.04.03
월드 좌표계로의 변환  (0) 2013.04.01
D3DXMATRIX 와 D3DXMATRIXA16  (0) 2013.03.25
PURE DEVICE  (3) 2013.03.24
Posted by 흰둥에미

최근에 달린 댓글

최근에 받은 트랙백

글 보관함