# a to convert a matrix to a quaternion

Hi everyone

I am new to the forum and just learning and in top of that I am not a native english speaker so please bear with me.

I am working with some animation and want to make a mesh move and rotate according to a bezier path I have manage to make it move but the way I came with to make it rotate is to make a lookat matrix look from the current to the next position in the bezier curve, I’m not very good at math so, I don’t know how to make a lookat quaternion so I use lookat matrix and convert it to a quaternion. All my rotation need to be in quaternion because all the interpolation is already done that way my scene graph, I tested my lookat matrix and is fine but the conversion to quaternion is wrong the function I am using is the one I have been seen around the web every where

void CQuaternion::FromMatrix(CMatrix& m)
{
float trace = 1 + m.m11 + m.m22 + m.m33;
float s = 0;

``````		if (trace &gt; 0.0000001)
{
s = (float)sqrt(trace) * 2;
x = (m.m23 - m.m32) / s;
y = (m.m31 - m.m13) / s;
z = (m.m12 - m.m21) / s;
w = 0.25f * s;
}
else
{
if (m.m11 &gt; m.m22 && m.m11 &gt; m.m33)
{
// Column 0:
s = (float)sqrt(1.0 + m.m11 - m.m22 - m.m33) * 2;
x = 0.25f * s;
y = (m.m12 + m.m21) / s;
z = (m.m31 + m.m13) / s;
w = (m.m23 - m.m32) / s;
}
else if (m.m22 &gt; m.m33)
{
// Column 1:
s = (float)sqrt(1.0 + m.m22 - m.m11 - m.m33) * 2;
x = (m.m12 + m.m21) / s;
y = 0.25f * s;
z = (m.m23 + m.m32) / s;
w = (m.m31 - m.m13) / s;
}
else
{
// Column 2:
s = (float)sqrt(1.0 + m.m33 - m.m11 - m.m22) * 2;
x = (m.m31 + m.m13) / s;
y = (m.m23 + m.m32) / s;
z = 0.25f * s;
w = (m.m12 - m.m21) / s;
}
}
}
``````

and this is my lookat matrix method just to be more clear

void CMatrix::LookAt(CVector3 Pos, CVector3 Target, CVector3 y)
{
CVector3 x, z;

``````	z = Target - Pos;
z.Normalize();

if(!z.x && z.y == 1.0f && !z.z)
{
Rotate(-1.5707963267948966f, 0.0f, 0.0f);
//	Translate( Pos.x,  Pos.y,  Pos.z);
return;
}else
if(!z.x && z.y == -1.0f && !z.z)
{
Identity();
Rotate(1.5707963267948f, 0.0f, 0.0f);
//	Translate( Pos.x,  Pos.y,  Pos.z);
return;
}

x.CrossProduct(z, y);
//x.Normalize();

y.CrossProduct(x, z);
y.Normalize();

m11 =  x.x;
m12 =  x.y;
m13 =  x.z;

m21 =  y.x;
m22 =  y.y;
m23 =  y.z;

m31 =  z.x;
m32 =  z.y;
m33 =  z.z;

/*don't need position
m14 = m24 = m34 = 0;
m41 = Pos[0];
m42 = Pos[1];
m43 = Pos[2];*/
m44 = 1.0f;
}
``````