Original Post
apparently, this code makes the results "break" at a certain point, it doesn't go thru the entire 360, but 0 ->180 then JUMPS to 270 and continues! any thoughts?
float D;
float tr_x, tr_y, angle_x, angle_y, angle_z,C;
angle_y = D = asin( mat[2]); /* Calculate Y-axis angle */
C = cos( angle_y );
//angle_y *= RADIANS;
if ( fabs( C ) > 0.005 ) /* Gimball lock? */
{
tr_x = mat[10] / C; /* No, so get X-axis angle */
tr_y = -mat[6] / C;
angle_x = atan2( tr_y, tr_x );// * RADIANS;
tr_x = mat[0] / C; /* Get Z-axis angle */
tr_y = -mat[1] / C;
angle_z = atan2( tr_y, tr_x );// * RADIANS;
}
else /* Gimball lock has occurred */
{
angle_x = 0; /* Set X-axis angle to zero */
tr_x = mat[5]; /* And calculate Z-axis angle */
tr_y = mat[4];
angle_z = atan2( tr_y, tr_x );// * RADIANS;
}
/* return only positive angles in [0,360] */
if (angle_x < 0) angle_x += 6.28318;
if (angle_y < 0) angle_y += 6.28318;
if (angle_z < 0) angle_z += 6.28318;
vec3 Res = vec3(0,0,-1) - vec3(cos(angle_x),cos(angle_y),cos(angle_z));
Res.Normalize();
return Res;
As you can see, this was ripped off the matrix and quat. faq ;)