최상단 광고

2012년 4월 9일 월요일

Quaternion - Tutorial6 Rotation by Quaternion


그럼 이번에는 Quaternion에 의한 회전을 해보도록 하겠습니다.
Euler의 각도로는 그냥 해당하는 축에 대해서 각도를 늘려주면 되지만
Quaternion은 어떻게 해야지 회전이 되는걸까요?
그럼 DirectX에 있는 Quaternion함수를 사용해보겠습니다.

먼저 앞에서 사용했던 소스에 이번에 비행기를 또 추가합니다.
위치는 0,0,0인 원점에 놓이게 합니다.
이정도는 알아서 해주세요. 소스 없습니다.
그럼 아래와 같은 상태가 될것입니다.



그럼 현재 상태를 90도 회전하려면 어떻게 해야할까요?
일단 뭐든지 회전을 하려면 기준축을 정해야하는것은 당연하기때문에
여러가지 방법을 알아보도록 하겠습니다.
1.Rotation axis, Rotation angle을 정의하여 회전하는 방법
Rotation axis = 0,1,0 이어야 하죠? 이유는 당연하구요.
angle = D3DX_PI/2(90도)
이렇게 해서 회전된 quaternion을 이용하여 matrix로 변환하여
회전시키는 방법.
소스)
Frame_Move에 아래소스를 추가
//static int qut_cnt=0;
D3DXQUATERNION rot_q; //The variable will be used to transformation
D3DXVECTOR3 rot_axis(0.0f,1.0f,0.0f); //Rotation Axis
D3DXQuaternionRotationAxis(&rot_q,&rot_axis,D3DX_PI/2);
D3DXMatrixRotationQuaternion(&g_Obj[17].m_mWorld,&rot_q);
g_Obj[17].m_mWorld *= 0.1f;
g_Obj[17].m_mWorld._44 = 1.0f;


이렇게 하면



위와 같이 90도 회전한 상태가 된것을 보실 수 있을것입니다.
그런데 회전방향이 이상하네요. 음... 이것도 왼손으로 90도 돌아간 상태로 나오는군요 역시...
이넘의 왼손좌표계...
아무튼 이상은 없습니다.
그럼 이것을 또한 Animation해보지요.
소스)
FrameMove에 추가한 소스를 아래와 같이 수정
static int qut_cnt=0;
D3DXQUATERNION rot_q; //The variable will be used to transformation
D3DXVECTOR3 rot_axis(0.0f,1.0f,0.0f); //Rotation Axis
D3DXQuaternionRotationAxis(&rot_q,&rot_axis,D3DX_PI/200*qut_cnt++);
D3DXMatrixRotationQuaternion(&g_Obj[17].m_mWorld,&rot_q);
g_Obj[17].m_mWorld *= 0.1f;
g_Obj[17].m_mWorld._44 = 1.0f;


이렇게 수정하면 count가 계속 올라가면서 Quaternion을 생성하고 또한 이를 Matrix로 변환해서 회전을 하도록 Animation하게
할 수 있습니다.
소스는 shadowmap(tutorial-61)-piccoro77.cpp입니다.

아무튼 이렇게 회전하는 방법이 있을테구요.
다른방법은로는
2.그냥 RPY를 이용하는 방법
static int qut_cnt=0;
D3DXQUATERNION rot_q; //The variable will be used to transformation
D3DXQuaternionRotationYawPitchRoll(&rot_q,D3DX_PI/200*qut_cnt++,0.0f,0.0f);
D3DXMatrixRotationQuaternion(&g_Obj[17].m_mWorld,&rot_q);
g_Obj[17].m_mWorld *= 0.1f;
g_Obj[17].m_mWorld._44 = 1.0f;


참고로 여기서는 Yaw가 Y축, Pitch가 X축, Roll가 X축이랍니다.
Euler각도는 각도의 순서를 잘 정의해줘야 사용할 수 있으니 주의가 필요하겠죠?

아무튼 이정도하겠습니다. 음... 다른 회전방법이 또 있나요? 있으면 더 덧붙이겠습니다.
그럼 이만.

댓글 없음: