Global Euler Angles

I'm trying to rotate a piece by special conditional increments (ie. 30, then 90, then 150, then 180, then 210, then 270, then 360) on an arbitrary axis in global space. Sounds easy enough, by checking which of these your axis is at and then setting it to the next one. However, in global space, a rotation in one axis will often be translated as changes to the others to keep it showing the way you meant with Unity's Z,X,Y rotation application order. To see an example, try rotating something to 180 degrees in the Y axis, then try doing the same with the X axis to see how it only ever gets 90 degrees away from 0 before changing other axes and coming back down.

There doesn't seem to be a difference between Transform.localEulerAngles and Transform.eulerAngles, both of which return the local ones. Thus, given all the possibilities for how a given global rotation can be represented in the local axis coordinates, is there a way to measure its "global rotation" of only one axis sanely?

more ▼

asked Mar 13, 2012 at 07:59 AM

blitzen gravatar image

359 89 78 82

Other than comparing it with objects that have known rotations, probably not. Using euler angles for this isn't a good idea, because the rotation itself isn't actually stored that way- the euler angles are calculated from the Quaternion.

Mar 13, 2012 at 08:07 AM syclamoth

If I take the time to learn how quaternions work, will the global angle be easily readable directly, so I don't have to store them in a separate Vector3 as mentioned below?

Mar 13, 2012 at 03:21 PM blitzen
(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

Well, if you want a rotation about an arbitrary axis, you won't be able to check a single component against a value. Just make another property on the GameObject that stores the object's "current angle" (the 30, 90, 150, ... above) around your arbitrary axis, and have a way to get the "next angle" around that axis given whatever your current angle is. Then just use transform.RotateAround to rotate your object sensibly.

For instance, when you're going from 30 degrees to 90 degrees:

 float CurrentAngle = 30.0f;
 float NextAngle = 90.0f;
 Vector3 axis = new Vector3(whatever);
 transform.RotateAround(transform.position, axis, NextAngle - CurrentAngle);

more ▼

answered Mar 13, 2012 at 01:43 PM

simubrett gravatar image

81 5 5 10

Thanks. I considered doing that but wanted to make sure I wasn't being wasteful if there was an easier way to calculate a global angle from local Euler angles or directly from the Quaternion. I may end up having to store it statically like that though.

Mar 13, 2012 at 03:17 PM blitzen
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here



Answers and Comments



asked: Mar 13, 2012 at 07:59 AM

Seen: 1724 times

Last Updated: Mar 13, 2012 at 03:37 PM