This site uses strictly necessary cookies. More Information

X- 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

### Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.

### Follow this Question

### Related Questions

Flip over an object (smooth transition) 3 Answers

Having Trouble with Vector3.Angle 1 Answer

Calc angle. 1 Answer

C# GameObject Reverses Z Rotation 0 Answers

Applying force with respect to angle with the ground? 1 Answer