Beispiel #1
0
GLUSAPI GLUSvoid GLUSAPIENTRY glusQuaternionGetEulerRzRyRxf(GLUSfloat angles[3], const GLUSfloat quaternion[4])
{
    GLUSfloat x = quaternion[0];
    GLUSfloat y = quaternion[1];
    GLUSfloat z = quaternion[2];
    GLUSfloat w = quaternion[3];

    GLUSfloat f00 = 1.0f - 2.0f * y * y - 2.0f * z * z;
    GLUSfloat f20 = 2.0f * x * z - 2.0f * w * y;

    if (f00 != 0.0f)
    {
        GLUSfloat f10 = 2.0f * x * y + 2.0f * w * z;
        GLUSfloat f21 = 2.0f * y * z + 2.0f * w * x;
        GLUSfloat f22 = 1.0f - 2.0f * x * x - 2.0f * y * y;

        angles[0] = glusMathRadToDegf(atan2f(f21, f22));
        angles[1] = glusMathRadToDegf(asinf(-f20));
        angles[2] = glusMathRadToDegf(atan2f(f10, f00));
    }
    else
    {
        GLUSfloat f01 = 2.0f * x * y - 2.0f * w * z;
        GLUSfloat f11 = 1.0f - 2.0f * x * x - 2.0f * z * z;

        angles[0] = glusMathRadToDegf(atan2f(f01, f11));
        angles[1] = glusMathRadToDegf(asinf(-f20));
        angles[2] = 0.0f;
    }

}
Beispiel #2
0
GLUSboolean GLUSAPIENTRY GLUSAPIENTRY glusQuaternionGetEulerRzRyRxf(GLUSfloat angles[3], const GLUSfloat quaternion[4])
{
    GLUSfloat x = quaternion[0];
    GLUSfloat y = quaternion[1];
    GLUSfloat z = quaternion[2];
    GLUSfloat w = quaternion[3];

    GLUSfloat f00 = 1.0f - 2.0f * y * y - 2.0f * z * z;
	GLUSfloat f10 = 2.0f * x * y + 2.0f * w * z;
    GLUSfloat f20 = 2.0f * x * z - 2.0f * w * y;

	GLUSfloat f01 = 2.0f * x * y - 2.0f * w * z;
	GLUSfloat f11 = 1.0f - 2.0f * x * x - 2.0f * z * z;
	GLUSfloat f21 = 2.0f * y * z + 2.0f * w * x;

	GLUSfloat f22 = 1.0f - 2.0f * x * x - 2.0f * y * y;

    if (!(f21 == 0.0f && f22 == 0.0f) && !(f10 == 0.0f && f00 == 0.0f))
    {
        angles[0] = glusMathRadToDegf(atan2f(f21, f22));
    	angles[1] = glusMathRadToDegf(asinf(-f20));
    	angles[2] = glusMathRadToDegf(atan2f(f10, f00));
    }
    else if (!(f01 == 0.0f && f11 == 0.0f))
    {
        angles[0] = glusMathRadToDegf(atan2f(f01, f11));
    	angles[1] = glusMathRadToDegf(asinf(-f20));
    	angles[2] = 0.0f;
    }
    else
    {
    	return GLUS_FALSE;
    }

    return GLUS_TRUE;
}