santyhamer
05-07-2001, 02:16 PM
How can I convert a rotation Matrix into a quaternion? This is my code:
void CQuaternion :: ConvertFromMatrix ( const CMatrix& m )
{
//NOTE: The matrix MUST BE homogeneus-orthonormalized
//Local variables
FLOATTYPE l_flFloat = m.GetElement(0,0)+m.GetElement(1,1)+m.GetElement(2 ,2);
unsigned int l_i, l_j, l_k, l_uiNxt[3]= {1,2,0};
if ( l_flFloat > static_cast<FLOATTYPE>(0.0) )
{
l_flFloat = static_cast<FLOATTYPE>(sqrt(l_flFloat+1.0));
m_flV[0] = (m.GetElement(2,1)-m.GetElement(1,2)) / (static_cast<FLOATTYPE>(2) * l_flFloat);
m_flV[1] = (m.GetElement(0,2)-m.GetElement(2,0)) / (static_cast<FLOATTYPE>(2) * l_flFloat);
m_flV[2] = (m.GetElement(1,0)-m.GetElement(0,1)) / (static_cast<FLOATTYPE>(2) * l_flFloat);
m_flS = static_cast<FLOATTYPE>(0.5) * l_flFloat;
}
else
{
( m.GetElement(1,1) > m.GetElement(0,0) ) ? l_i = 1 : l_i = 0;
if ( m.GetElement(2,2) > l_i ) l_i = 2;
l_j = l_uiNxt[l_i];
l_k = l_uiNxt[l_j];
l_flFloat = static_cast<FLOATTYPE>( sqrt ( m.GetElement(l_i,l_i) - m.GetElement(l_j,l_j) - m.GetElement(l_k,l_k) + static_cast<FLOATTYPE>(1) ) );
operator[](l_i) = l_flFloat * static_cast<FLOATTYPE>(0.5);
l_flFloat = static_cast<FLOATTYPE>(4) * operator[](l_i);
m_flS = ( m.GetElement(l_k,l_j) - m.GetElement(l_j,l_k) ) / l_flFloat;
operator[](l_j) = ( m.GetElement(l_j,l_i) + m.GetElement(l_i,l_j) ) / l_flFloat;
operator[](l_k) = ( m.GetElement(l_k,l_i) + m.GetElement(l_i,l_k) ) / l_flFloat;
}
but doesn't work correctly for matrix trace <= 0.0f. Anybody could tell me why?
void CQuaternion :: ConvertFromMatrix ( const CMatrix& m )
{
//NOTE: The matrix MUST BE homogeneus-orthonormalized
//Local variables
FLOATTYPE l_flFloat = m.GetElement(0,0)+m.GetElement(1,1)+m.GetElement(2 ,2);
unsigned int l_i, l_j, l_k, l_uiNxt[3]= {1,2,0};
if ( l_flFloat > static_cast<FLOATTYPE>(0.0) )
{
l_flFloat = static_cast<FLOATTYPE>(sqrt(l_flFloat+1.0));
m_flV[0] = (m.GetElement(2,1)-m.GetElement(1,2)) / (static_cast<FLOATTYPE>(2) * l_flFloat);
m_flV[1] = (m.GetElement(0,2)-m.GetElement(2,0)) / (static_cast<FLOATTYPE>(2) * l_flFloat);
m_flV[2] = (m.GetElement(1,0)-m.GetElement(0,1)) / (static_cast<FLOATTYPE>(2) * l_flFloat);
m_flS = static_cast<FLOATTYPE>(0.5) * l_flFloat;
}
else
{
( m.GetElement(1,1) > m.GetElement(0,0) ) ? l_i = 1 : l_i = 0;
if ( m.GetElement(2,2) > l_i ) l_i = 2;
l_j = l_uiNxt[l_i];
l_k = l_uiNxt[l_j];
l_flFloat = static_cast<FLOATTYPE>( sqrt ( m.GetElement(l_i,l_i) - m.GetElement(l_j,l_j) - m.GetElement(l_k,l_k) + static_cast<FLOATTYPE>(1) ) );
operator[](l_i) = l_flFloat * static_cast<FLOATTYPE>(0.5);
l_flFloat = static_cast<FLOATTYPE>(4) * operator[](l_i);
m_flS = ( m.GetElement(l_k,l_j) - m.GetElement(l_j,l_k) ) / l_flFloat;
operator[](l_j) = ( m.GetElement(l_j,l_i) + m.GetElement(l_i,l_j) ) / l_flFloat;
operator[](l_k) = ( m.GetElement(l_k,l_i) + m.GetElement(l_i,l_k) ) / l_flFloat;
}
but doesn't work correctly for matrix trace <= 0.0f. Anybody could tell me why?