- Home /
Getting the rotation of an object does not return correct rotation
So I have a box with script BoxScript on it. BoxScript looks like this:
void Update () {
float fdegree = radianToDegree(transform.rotation.y);
Debug.Log(fdegree);
}
float radianToDegree(float angle){
return angle * (180.0f / Mathf.PI);
}
Whenever I run the script and turn the box using the editor in game it does not display what the real degree is. Can someone help me with this?
Answer by aldonaletto · Dec 12, 2012 at 03:37 AM
This is a recurrent problem in Unity: the Inspector fool us by showing transform.localEulerAngles under the caption Rotation - almost everybody (me included) thinks at first that transform.rotation holds the rotation angles around the world axis, but it doesn't: transform.rotation is a quaternion, and its XYZW components form a normalized Vector4 - thus none of them can even dream about be greater than 1.
Ok, you could replace transform.rotation.y by transform.localEulerAngles.y and forget about Mathf.PI (localEulerAngles returns degrees directly), but this probably would return weird values at certain ranges - that's because the conversion quaternion->euler may return several different XYZ combinations, all of them correct, but frequently different from what we expect. A simple example: the Euler angles (0,180,0) mean the object rotated 180 degrees around the Y axis, but the same rotation could be achieved with the Euler angles (180,0,180) and several other combinations - and Unity often returns the "wrong" combination.
As a rule of thumb, if the other angles are 0, you will get the expect results (kind of, because an object rotated -10 degrees may return 350 instead of -10). A possible solution, which works even when there are small angles in X and Z, is the following:
float AngleAboutY(Transform obj){
Vector3 objFwd = obj.forward;
float angle = Vector3.Angle(objFwd, Vector3.forward);
float sign = Mathf.Sign(Vector3.Cross(objFwd, Vector3.forward).y);
return angle * sign;
}
Vector3.Angle returns the absolute angle between the two vectors (in the plane formed by them), and the Y sign of the cross product of both vectors is used to correct its polarity (swap the Cross arguments if the polarity is opposed to what you expect).
If the angles about X and/or Z are different from zero, the result will get progressively more wrong - thus, try to keep these angles at zero.
Your answer
Follow this Question
Related Questions
Flip over an object (smooth transition) 3 Answers
Having Trouble with Vector3.Angle 1 Answer
How to smoothly rotate an object through just one axis 1 Answer
Calc angle. 1 Answer
Applying force with respect to angle with the ground? 1 Answer