Code: Select all
void QtoE (float qx, float qy, float qz, float qw)
{
double test = qx * qy + qz * qw;
float sqx = qx * qx;
float sqy = qy * qy;
float sqz = qz * qz;
float sqw = qw * qw;
double unit = sqx + sqy + sqz + sqw;
double RadtoDeg = 57.2957795;
if (test > 0.499 * unit)
{
Ey = 2 * atan2(qx,qw);
Ez = pi / 2;
Ex = 180;
if (Ey < 0)
Ey += 360;
if (Ex < 0)
Ex += 360;
if (Ez < 0)
Ez += 360;
return;
}
if (test < -0.499 * unit)
{
Ey = -2 * atan2(qx,qw);
Ez = -pi / 2;
Ex = -180;
if (Ey < 0)
Ey += 360;
if (Ex < 0)
Ex += 360;
if (Ez < 0)
Ez += 360;
return;
}
Ey = RadtoDeg * (atan2(2 * qy * qw - 2 * qx * qz, sqx - sqy - sqz + sqw));
Ez = RadtoDeg * (asin(2*test/unit));
Ex = RadtoDeg * (atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw));
if (Ey < 0)
Ey += 360;
if (Ex < 0)
Ex += 360;
if (Ez < 0)
Ez += 360;
return;
}
1) Is there a Quaternion to Euler converter in bullet?
2) If not, is there something wrong with my code?
3) If not, does bullet use global or local rotation?
Thanks in Advance!