쿼터니온을 이용해서 Rotation값을 보간하고 있습니다..
그런데 최종적으로 행렬로 변환하면서 문제가 있는데요..
제가 GPG1에 있는 쿼터니온-행렬 변환을 사용하다가..
DX SDK에 있는 변환함수를 사용하니 문제가 생겨서 이렇게 질문을 드립니다.
Code: Select all
// GPG 쿼터니온 변환
void Quat::MakeRotationMatrix( Matrix4 &_mat ) const
{
float xx2 = 2.0f*x*x;
float yy2 = 2.0f*y*y;
float zz2 = 2.0f*z*z;
float xy2 = 2.0f*x*y;
float xz2 = 2.0f*x*z;
float yz2 = 2.0f*y*z;
float wx2 = 2.0f*w*x;
float wy2 = 2.0f*w*y;
float wz2 = 2.0f*w*z;
_mat._11 = 1.0f-(yy2+zz2); _mat._12 = xy2 - wz2; _mat._13 = wy2 + xz2; _mat._14 = 0.0f;
_mat._21 = xy2 + wz2; _mat._22 = 1.f - (xx2+zz2); _mat._23 = yz2 - wx2; _mat._24 = 0.0f;
_mat._31 = xz2 - wy2; _mat._32 = yz2 + wx2; _mat._33 = 1.f - (xx2+yy2); _mat._34 = 0.0f;
_mat._41 = _mat._42 = _mat._43 = 0.0f; _mat._44 = 1.0f;
}
// D3D 쿼터니온 변환
void Quat::MakeRotationMatrix( Matrix4 &_mat ) const
{
float xx2 = 2.0f*x*x;
float yy2 = 2.0f*y*y;
float zz2 = 2.0f*z*z;
float xy2 = 2.0f*x*y;
float xz2 = 2.0f*x*z;
float yz2 = 2.0f*y*z;
float sx2 = 2.0f*w*x;
float sy2 = 2.0f*w*y;
float sz2 = 2.0f*w*z;
_mat._11 = 1.0f-yy2-zz2; _mat._12 = xy2 + sz2; _mat._13 = xz2 - sy2; _mat._14 = 0.0f;
_mat._21 = xy2 - sz2; _mat._22 = 1.0f-xx2-zz2; _mat._23 = yz2 + sx2; _mat._24 = 0.0f;
_mat._31 = xz2 + sy2; _mat._32 = yz2 - sx2; _mat._33 = 1.0f-xx2-yy2; _mat._34 = 0.0f;
_mat._41 = _mat._42 = _mat._43 = 0.0f; _mat._44 = 1.0f;
}
*/
gpg로 하면 잘나오는데 DXSDK로 하면 잘 안나옵니다 (옆으로 기울어서 삐뚤게 나오는것 같습니다.)
3DMax플러그인에서 IGameExporter를 사용하여 D3D좌표로 설정해주고 애니메이션을 뽑는데..
좀 이상하군요..