Real world uses of Quaternions?
I believe they are used in quantum physics as well, because rotation with quaternions models Spinors extremely well (due to the lovely property that you need to rotate a point in quaternionic space around 2 full revolutions to get back to your 'original', which is exactly what happens with spin-1/2 particles).
They are also, as you said, used in computer graphics a lot for several reasons:
- they are much more space efficient to store than rotation matrices (4 floats rather than 16)
- They are much easier to interpolate than euler angle rotations (spherical interpolation or normalised liner interpolation)
- They avoid gimbal lock
- It's much cooler to say that your rotation is described as 'a great circle on the surface of a unit 4 dimensional hypersphere' :)
I think there are other uses, but a lot of them have been superseded by more general Vectors.
To understand the benefits of using quaternions you have to consider different ways to represent rotations.
Here are few ways with a summary of the pros and cons:
- Euler angles
- Rotation matrices
- Axis angle
- Quaternions
- Rotors (normalized Spinors)
Euler angles are the best choice if you want a user to specify an orientation in a intuitive way. They are are also space efficient (three numbers). However, it is more difficult to linear interpolate values. Consider the case where you want to interpolate between 359 and 0 degrees. Linearly interpolating would cause a large rotation, even though the two orientations are almost the same. Writing shortest path interpolation, is easy for one axis, but non-trivial when considering the three Euler angles(for instance the shortest route between (240, 57, 145) and (35, -233, -270) is not immediately clear).
Rotation matrices specify a new frame of reference using three normalized and orthogonal vectors (Right, Up, Out, which when multiplied become the new x, y, z). Rotation matrices are useful for operations like strafing (side ways movement), which only requires translating along the Right vector of the camera's rotation matrix. However, there is no clear method of interpolating between them. The are also expensive to normalize which is necessary to prevent scaling from being introduced.
Axis angle, as the name suggests, are a way of specifying a rotation axis and angle to rotate around that axis. You can think of Euler angles, as three axis angle rotations, where the axises are the x, y, z axis respectively. Linearly interpolating the angle in a axis angle is pretty straight forward (if you remember to take the shortest path), however linearly interpolating between different axises is not.
Quaternions are a way of specifying a rotation through a axis and the cosine of half the angle. They main advantage is I can pick any two quaternions and smoothly interpolate between them.
Rotors are another way to perform rotations. Rotors are basically quaternions, but instead of thinking of them as 4D complex numbers, rotors are thought of as real 3D multivectors. This makes their visualization much more understandable (compared to quaternions), but requires fluency in geometric algebra to grasp their significance.
Okay with that as the background I can discuss a real world example.
Say you are writing a computer game where the characters are animated in 3ds Max. You need to export a animation of the character to play in your game, but cannot faithfully represent the interpolation used by the animation program, and thus have to sample. The animation is going to be represented as a list of rotations for each joint. How should we store the rotations?
If I am going to sample every frame, not interpolate, and space is not an issue, I would probably store the rotations as rotation matrices. If space was issue, then Euler angles. That would also let me do things like only store one angle for joints like the knee that have only one degree of freedom.
If I only sampled every 4 frames, and need to interpolate it depends on whether I am sure the frame-rate will hold. If I am positive that the frame-rate will hold I can use axis angle relative rotations to perform the interpolation. This is atypical. In most games the frame rate can drop past my sampling interval, which would require skipping an element in the list to maintain the correct playback speed. If I am unsure of what two orientations I need to interpolate between, then I would use quaternions or rotors.
One place they are frequently used is in computer games when you want to smoothly transition from one rotation to another. An artist might have said "at this time I want the head oriented like this and at that time I want it like this". The computer needs to work out what happens in-between these poses. It's quite easy to find in-between poses using quaternions. If the two poses are reasonably similar, then you can get a half-way orientation simply by taking the average of the quaternions. You can find out more here.
I want to add one application of quaternions. In multiantenna radio transmission the so called Alamouti code is based on the algebra of Hamiltonian quaternions. See
http://en.wikipedia.org/wiki/Space%E2%80%93time_block_code
for more information. That Wikipedia article is a bit more general about Space-Time coding, but you can find the Alamouti construction there. The quaternion algebra shows there as a way of disentangling two Alamouti coded signals transmitted by a pair of antennas. The advantages come from the fact that even if the signal from one antenna is lost for a particular receiver (due to sitting in a node for that particular radio wave), then the signal from the other antenna saves the day. A moving receiver will drop a signal from one antenna in a random fashion, so when two independent antennas are used in this way total signal loss becomes a rarer event.