Euler Angles
Euler angles can be confusing and inadequate to describe 3D rotations.
Nevertheless, they are intuitive and useful for describing the orientation of an object in terms that are readily understood by humans.
This page is created as a reference for the various factors that can affect how euler angles are described.
1. The order of rotations.
2. Rotations relative to object or world coordinate system
Quaternions have been proposed as another representation of rotation angles that does not have the same problems that plague euler angles.
Jack Kuipers book is an excellent resource for learning more about quaternions!
Reference frame is world and is fixed
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xyz
[cos(Ry)*cos(Rz), -cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), sin(Rx)*sin(Rz) + cos(Rx)*cos(Rz)*sin(Ry), 0]
[cos(Ry)*sin(Rz), cos(Rx)*cos(Rz) + sin(Rx)*sin(Ry)*sin(Rz), -cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), 0]
[ -sin(Ry), cos(Ry)*sin(Rx), cos(Rx)*cos(Ry), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xzy
[ cos(Ry)*cos(Rz), sin(Rx)*sin(Rz) - cos(Rx)*cos(Rz)*sin(Ry), cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), 0]
[ sin(Ry), cos(Rx)*cos(Ry), -cos(Ry)*sin(Rx), 0]
[-cos(Ry)*sin(Rz), cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), cos(Rx)*cos(Rz) - sin(Rx)*sin(Ry)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yxz
[cos(Rx)*cos(Rz) - sin(Rx)*sin(Ry)*sin(Rz), -cos(Ry)*sin(Rz), cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), 0]
[cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), cos(Ry)*cos(Rz), sin(Rx)*sin(Rz) - cos(Rx)*cos(Rz)*sin(Ry), 0]
[ -cos(Ry)*sin(Rx), sin(Ry), cos(Rx)*cos(Ry), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yzx
[ cos(Rx)*cos(Ry), -sin(Ry), cos(Ry)*sin(Rx), 0]
[ sin(Rx)*sin(Rz) + cos(Rx)*cos(Rz)*sin(Ry), cos(Ry)*cos(Rz), -cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), 0]
[-cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), cos(Ry)*sin(Rz), cos(Rx)*cos(Rz) + sin(Rx)*sin(Ry)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zyx
[ cos(Rx)*cos(Ry), -cos(Ry)*sin(Rx), sin(Ry), 0]
[cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), cos(Rx)*cos(Rz) - sin(Rx)*sin(Ry)*sin(Rz), -cos(Ry)*sin(Rz), 0]
[sin(Rx)*sin(Rz) - cos(Rx)*cos(Rz)*sin(Ry), cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zxy
[ cos(Rx)*cos(Rz) + sin(Rx)*sin(Ry)*sin(Rz), -cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), cos(Ry)*sin(Rz), 0]
[ cos(Ry)*sin(Rx), cos(Rx)*cos(Ry), -sin(Ry), 0]
[-cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), sin(Rx)*sin(Rz) + cos(Rx)*cos(Rz)*sin(Ry), cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xzx
[ cos(Ry), -cos(Rx)*sin(Ry), sin(Rx)*sin(Ry), 0]
[cos(Rz)*sin(Ry), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), -cos(Rx)*sin(Rz) - cos(Ry)*cos(Rz)*sin(Rx), 0]
[sin(Ry)*sin(Rz), cos(Rz)*sin(Rx) + cos(Rx)*cos(Ry)*sin(Rz), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xyx
[ cos(Ry), sin(Rx)*sin(Ry), cos(Rx)*sin(Ry), 0]
[ sin(Ry)*sin(Rz), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), -cos(Rz)*sin(Rx) - cos(Rx)*cos(Ry)*sin(Rz), 0]
[-cos(Rz)*sin(Ry), cos(Rx)*sin(Rz) + cos(Ry)*cos(Rz)*sin(Rx), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yxy
[ cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), sin(Ry)*sin(Rz), cos(Rz)*sin(Rx) + cos(Rx)*cos(Ry)*sin(Rz), 0]
[ sin(Rx)*sin(Ry), cos(Ry), -cos(Rx)*sin(Ry), 0]
[-cos(Rx)*sin(Rz) - cos(Ry)*cos(Rz)*sin(Rx), cos(Rz)*sin(Ry), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yzy
[-sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), -cos(Rz)*sin(Ry), cos(Rx)*sin(Rz) + cos(Ry)*cos(Rz)*sin(Rx), 0]
[ cos(Rx)*sin(Ry), cos(Ry), sin(Rx)*sin(Ry), 0]
[-cos(Rz)*sin(Rx) - cos(Rx)*cos(Ry)*sin(Rz), sin(Ry)*sin(Rz), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zyz
[-sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), -cos(Rx)*sin(Rz) - cos(Ry)*cos(Rz)*sin(Rx), cos(Rz)*sin(Ry), 0]
[ cos(Rz)*sin(Rx) + cos(Rx)*cos(Ry)*sin(Rz), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), sin(Ry)*sin(Rz), 0]
[ -cos(Rx)*sin(Ry), sin(Rx)*sin(Ry), cos(Ry), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zxz
[cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), -cos(Rz)*sin(Rx) - cos(Rx)*cos(Ry)*sin(Rz), sin(Ry)*sin(Rz), 0]
[cos(Rx)*sin(Rz) + cos(Ry)*cos(Rz)*sin(Rx), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), -cos(Rz)*sin(Ry), 0]
[ sin(Rx)*sin(Ry), cos(Rx)*sin(Ry), cos(Ry), 0]
[ 0, 0, 0, 1]
Reference frame is local and is moving
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xyz
[ cos(Ry)*cos(Rz), cos(Ry)*sin(Rz), -sin(Ry), 0]
[-cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), cos(Rx)*cos(Rz) + sin(Rx)*sin(Ry)*sin(Rz), cos(Ry)*sin(Rx), 0]
[ sin(Rx)*sin(Rz) + cos(Rx)*cos(Rz)*sin(Ry), -cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), cos(Rx)*cos(Ry), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xzy
[ cos(Ry)*cos(Rz), sin(Ry), -cos(Ry)*sin(Rz), 0]
[sin(Rx)*sin(Rz) - cos(Rx)*cos(Rz)*sin(Ry), cos(Rx)*cos(Ry), cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), 0]
[cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), -cos(Ry)*sin(Rx), cos(Rx)*cos(Rz) - sin(Rx)*sin(Ry)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yxz
[cos(Rx)*cos(Rz) - sin(Rx)*sin(Ry)*sin(Rz), cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), -cos(Ry)*sin(Rx), 0]
[ -cos(Ry)*sin(Rz), cos(Ry)*cos(Rz), sin(Ry), 0]
[cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), sin(Rx)*sin(Rz) - cos(Rx)*cos(Rz)*sin(Ry), cos(Rx)*cos(Ry), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yzx
[cos(Rx)*cos(Ry), sin(Rx)*sin(Rz) + cos(Rx)*cos(Rz)*sin(Ry), -cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), 0]
[ -sin(Ry), cos(Ry)*cos(Rz), cos(Ry)*sin(Rz), 0]
[cos(Ry)*sin(Rx), -cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), cos(Rx)*cos(Rz) + sin(Rx)*sin(Ry)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zyx
[ cos(Rx)*cos(Ry), cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), sin(Rx)*sin(Rz) - cos(Rx)*cos(Rz)*sin(Ry), 0]
[-cos(Ry)*sin(Rx), cos(Rx)*cos(Rz) - sin(Rx)*sin(Ry)*sin(Rz), cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), 0]
[ sin(Ry), -cos(Ry)*sin(Rz), cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zxy
[ cos(Rx)*cos(Rz) + sin(Rx)*sin(Ry)*sin(Rz), cos(Ry)*sin(Rx), -cos(Rx)*sin(Rz) + cos(Rz)*sin(Rx)*sin(Ry), 0]
[-cos(Rz)*sin(Rx) + cos(Rx)*sin(Ry)*sin(Rz), cos(Rx)*cos(Ry), sin(Rx)*sin(Rz) + cos(Rx)*cos(Rz)*sin(Ry), 0]
[ cos(Ry)*sin(Rz), -sin(Ry), cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xzx
[ cos(Ry), cos(Rz)*sin(Ry), sin(Ry)*sin(Rz), 0]
[-cos(Rx)*sin(Ry), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), cos(Rz)*sin(Rx) + cos(Rx)*cos(Ry)*sin(Rz), 0]
[ sin(Rx)*sin(Ry), -cos(Rx)*sin(Rz) - cos(Ry)*cos(Rz)*sin(Rx), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
xyx
[ cos(Ry), sin(Ry)*sin(Rz), -cos(Rz)*sin(Ry), 0]
[sin(Rx)*sin(Ry), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), cos(Rx)*sin(Rz) + cos(Ry)*cos(Rz)*sin(Rx), 0]
[cos(Rx)*sin(Ry), -cos(Rz)*sin(Rx) - cos(Rx)*cos(Ry)*sin(Rz), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yxy
[cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), sin(Rx)*sin(Ry), -cos(Rx)*sin(Rz) - cos(Ry)*cos(Rz)*sin(Rx), 0]
[ sin(Ry)*sin(Rz), cos(Ry), cos(Rz)*sin(Ry), 0]
[cos(Rz)*sin(Rx) + cos(Rx)*cos(Ry)*sin(Rz), -cos(Rx)*sin(Ry), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
yzy
[-sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), cos(Rx)*sin(Ry), -cos(Rz)*sin(Rx) - cos(Rx)*cos(Ry)*sin(Rz), 0]
[ -cos(Rz)*sin(Ry), cos(Ry), sin(Ry)*sin(Rz), 0]
[ cos(Rx)*sin(Rz) + cos(Ry)*cos(Rz)*sin(Rx), sin(Rx)*sin(Ry), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zyz
[-sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), cos(Rz)*sin(Rx) + cos(Rx)*cos(Ry)*sin(Rz), -cos(Rx)*sin(Ry), 0]
[-cos(Rx)*sin(Rz) - cos(Ry)*cos(Rz)*sin(Rx), cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), sin(Rx)*sin(Ry), 0]
[ cos(Rz)*sin(Ry), sin(Ry)*sin(Rz), cos(Ry), 0]
[ 0, 0, 0, 1]
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
zxz
[ cos(Rx)*cos(Rz) - cos(Ry)*sin(Rx)*sin(Rz), cos(Rx)*sin(Rz) + cos(Ry)*cos(Rz)*sin(Rx), sin(Rx)*sin(Ry), 0]
[-cos(Rz)*sin(Rx) - cos(Rx)*cos(Ry)*sin(Rz), -sin(Rx)*sin(Rz) + cos(Rx)*cos(Ry)*cos(Rz), cos(Rx)*sin(Ry), 0]
[ sin(Ry)*sin(Rz), -cos(Rz)*sin(Ry), cos(Ry), 0]
[ 0, 0, 0, 1]