Game Development Reference
In-Depth Information
angles internally, and those that don't still often represent orientations to the user as
Euler angles.
Unfortunately Euler angles are almost useless for our needs. We can see this
by looking at some of the implications of working with them. You can follow this
through by making a set of axes with your hand (as described in section 2.1.1), re-
membering that your imaginary object is facing in the same direction as your palm—
along the Z axis.
Imagine we first perform a pitch, by 30 or so. The object now has its nose up in
the air. Now perform a yaw by about the same amount. Notice that the yaw axis is no
longer pointing up: when we pitched the object, the yaw axis also moved. Remember
where the object is pointing. Now start again, but perform the yaw first, then the
pitch. The object will be in a slightly different position. What does this mean? If we
have a rotation vector like
0 . 3
0 . 4
0 . 1
in what order do we perform the rotations? The result may be different for each or-
der. What is more, because the order is crucial, we can't simply use regular vector
mathematics to combine rotations. In particular,
r 1 ·
r 2 =
r 2 ·
r 1
where r 1 and r 2 are two rotations.
In case you think that the problem is caused by moving the rotation axes around
(i.e., keeping them welded to the object rather than fixed in the world), try it the
other way. Not only does the same problem still occur, but now we have another
issue—gimbal lock.
Gimbal lock occurs when we rotate an object such that what started as one axis
now aligns with another. For example, assume we're applying the rotations in the
order X, then Y, then Z. If we yaw around by 90 (i.e., no X rotation, 90 Y rotation),
the front of the object is now pointing in the negative X direction. Say we wanted to
have the object roll slightly now (roll from its own point of view). We can't do that: the
axis we need (the local Z axis) is now pointing in the X direction, and we've already
passed the point of applying X rotations.
So maybe we should have applied a little bit of X rotation first before rotating in
the Y direction. Try it: you can't do it. For this particular problem we could perform
the rotations in a different order—ZYX, for example. This would solve the problem
for the previous example, but there'd be new orientations that this ordering couldn't
represent. Once rotations of around 90 come into play, we can't achieve all desired
orientations with a combination of Euler angles. This is called “gimbal lock.”
There are some ways to mitigate the problem, by using combinations of axes,
someofwhichmovewiththeobjectandsomeofwhicharefixedinworldspace.
Alternatively we can repeat rotations around some axes. There are a lot of different