Euler angles convention in Blender (extrinsic vs intrinsic)

Hello!

I believe that there may be an error in the Euler angle convention in Blender. Specifically, when creating a new object in Blender and assigning rotations using the N panel, if we assign a rotation of (90, 0, 0) in XYZ Euler, the resulting global matrix (which we’ll call Rx) for the object is

|  1, 0, 0, | 
|  0, 0,-1, |
|  0, 1, 0  |

Similarly, if we assign a rotation of (0, 90, 0) in XYZ Euler, the resulting global matrix (which we’ll call Ry) is

|  0, 0, 1, | 
|  0, 1, 0, |
| -1, 0, 0  |

So far, this corresponds with the expected results.

However, the problem arises when we assign a rotation of (90, 90, 0) in XYZ Euler from the N panel. The resulting global matrix (which we’ll call Rxy) is

|  0, 1, 0, |
|  0, 0,-1, |
| -1, 0, 0  |

when the expected result would be

Rx * Ry = | 0,0,1,| 
          | 1,0,0,|
          | 0,1,0 | 

given that XYZ Euler was selected in the panel.

This leads me to suspect that Blender is following the ZYX convention regardless of the selection made in the panel.

Can anyone confirm if this is a bug or if I am missing something?

PS: I have used the following pages to perform the calculations:

https://www.andre-gaschler.com/rotationconverter/

1 Like

Consider what happens when you multiply this matrix with a vector:

(Rx * Ry * Rz) * v = Rx * (Ry * (Rz * v))

As you can see this would apply rotations in ZYX order. So for XYZ you reverse the order:

(Rz * Ry * Rx) * v = Rz * (Ry * (Rx * v))

Maybe there are different naming conventions for this?

2 Likes

Hi @brecht thanks for the quick response.
Let me put this in other way because I’m getting a behavior with euler rotations that I’m not expecting, I did some more research:

I assumed that the the only possible convention with Euler was the intrinsic one (Euler angles - Wikipedia) in which elemental rotations that occur about the axes of a coordinate system XYZ attached to a moving body.

With that assumption I expected that, for example, If I rotated an object in Blender using the keyboard sequence:

RKEY, XKEY, XKEY, 30
RKEY, YKEY, YKEY, 30

I would obtain an Euler rotation of (30, 30, 0), but instead I get: (33.7, 25.7, 16,1)

I guess that the answer is that Blender uses extrinsic euler convention Euler angles - Wikipedia

1 Like

I guess so. The object rotation is still intrinsic in how it works when combined with parenting or instancing transforms, so it’s a bit confusing. Regardless it seems to be only a difference in naming convention.

1 Like