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]