- Home /
Question by
CDAXRC · Jan 16, 2019 at 11:50 AM ·
euleranglesgimbal-lock
How can I display euler angles 0-360 without triggering gimbal lock/ flipping values?
I found that solution but it's not working. When I rotatate object around one axis,sometiomes script modify two values.
public static Vector3 ConvertQuant2Euler(Quaternion quaternion) { float tempEuler; float[] eulerAngles = new float[3]; float[] fixedEulerAngles = new float[3];
//Convert pitch - X
tempEuler = Mathf.Atan2(2 * quaternion.x * quaternion.w + 2 * quaternion.y * quaternion.z, 1 - 2 * quaternion.x * quaternion.x - 2 * quaternion.z * quaternion.z);
eulerAngles[0] = tempEuler * 180 / Mathf.PI;
if (eulerAngles[0] < 0)
{
fixedEulerAngles[0] = 180 + (180 + eulerAngles[0]);
}
if (eulerAngles[0] > 0)
{
fixedEulerAngles[0] = eulerAngles[0];
}
//Convert yaw - Y
tempEuler = Mathf.Asin(2 * quaternion.x * quaternion.y + 2 * quaternion.z * quaternion.w);
eulerAngles[1] = tempEuler * 180 / Mathf.PI;
if (eulerAngles[1] < 0)
{
fixedEulerAngles[1] = 180 + (180 + eulerAngles[1]);
}
if (eulerAngles[1] > 0)
{
fixedEulerAngles[1] = eulerAngles[1];
}
//Convert roll - Z
tempEuler = Mathf.Atan2(2 * quaternion.y * quaternion.w + 2 * quaternion.x * quaternion.z, 1 - 2 * quaternion.y * quaternion.y - 2 * quaternion.z * quaternion.z);
eulerAngles[2] = tempEuler * 180 / Mathf.PI;
if (eulerAngles[2] < 0)
{
fixedEulerAngles[2] = 180 + (180 + eulerAngles[2]);
}
if (eulerAngles[2] > 0)
{
fixedEulerAngles[2] = eulerAngles[2];
}
return new Vector3(fixedEulerAngles[0], fixedEulerAngles[1], fixedEulerAngles[2]);
}
Comment