Rotations in Three Dimensions
Date: 11/11/1999 at 21:11:14 From: Drew Subject: Quaternions and 3D rotations Hello: I am trying to learn about quaternions and 3D rotations. I am trying to build my own 3D engine and ran into the classic problem concerning Euler angles. I understand the basics for quaternions, but don't understand how to use them to rotate something in 3D. I have read many books about it but they are all too complex. What if I want to rotate something (30 degrees about x, 20 about new y, -36 about new z)? None of the sources I have found are simple enough. Additionally, could you tell me how to rotate something about any general line in 3D? I know they are both connected, I just don't know how to do it. Thanks a lot, Drew
Date: 11/12/1999 at 08:27:56 From: Doctor Mitteldorf Subject: Re: Quaternions and 3D rotations Dear Drew, I don't know enough about quaternions to tell you how to relate them to rotation matrices. I do know about rotation matrices, and I don't think they have to be very hard. To rotate an angle a about the z axis, apply the matrix: [cos(a) -sin(a) 0] [sin(a) cos(a) 0] [ 0 0 1] From this, I am sure you can construct similar matrices for rotating about x and y. To do two rotations in a row, multiply the second matrix on the left by the first matrix on the right. This should answer your question about rotating something about multiple axes. Just multiply the 3 matrices together, with the last of the three operations on the left. To rotate about a general line in 3D, here's your strategy: First, construct a rotation about z so that your line has no more y in it - it is purely x and z. Call this matrix A. Then rotate about the new y-axis until the new z axis is right along your line. Call this matrix B. Multiply BA = C, and calculate the inverse C^-1 = A^-1 * B^-1. Now you have a matrix C that moves your z-axis to the line about which you wish to rotate. C^-1 * C clearly does nothing at all. But suppose that you sandwich another rotation in between: C^-1 * D * C, where D is a rotation about the z-axis. Now you have a matrix that first moves the z-axis to the line you've specified, then rotates about that line, then puts the z-axis back where it would have been. This is the matrix you want: C^-1 * D * C is the rotation about the given line. - Doctor Mitteldorf, The Math Forum http://mathforum.org/dr.math/
Date: 12/2/2002 From: Jill Subject: Re: Quaternions and 3D rotations The preceding answer avoids this specific use of the quaternion. I believe some reasons for that may be: it is not used in the classic manner, and as a result is not encountered by math enthusiasts very often. This specific use is not as bad as it seems, it's just uncommon, unfamiliar, and applied a little differently. With Euler angles the "Gimbal lock" problem is that certain orientations are difficult or impossible to attain. And around these orientations any kind of precision is just as difficult. In some homebrew software you may have noticed the "top-over flip" effect, which is that as you pass over the vertical axis, the object or view suddenly flips by Pi degrees. The quaternion has 4 parts, basically three imaginary numbers and a scalar. Using the quaternion to overcome the "Gimbal lock" problem, the three imaginary numbers are used with the imaginary part simply removed [x,y,z]. As non-imaginary scalars they represent an arbitrary axis orientation in three dimensions, and the scalar [w] is used to represent a rotation around this axis. Note this also means there is more than one quaternion to represent any particular orientation. This overcomes the "Gimbal lock" problem. There is more: With these unique properties of the quaternion, it also makes the application and adding of rotational vectors much more intuitive for humans, and easier to code. For example, when using Euler angles, if you move the joystick forward and backward you would expect a rotation around the x-axis, and if you move it left and right you would expect rotation around the z-axis, and similarly if you twist the handle of the joystick you would expect rotation around the y-axis. But if you move forward, then to the side, then twist, then undo each in the original order, you will see that [depending on which axis is calculated first] the last two angles calculated don't rotate around the expected axis, but around the projected axis after prior calculation(s). With the quaternion, the projection from the joystick can be more directly applied to the rotation of the object or view, and thus much more intuitive. Another example is in physics. When applying your rotational velocity and/or rotational acceleration vectors, they can be added and applied much more directly and intuitively. It makes the calculations much more simple and thus much less complicated code, etc. When you grasp the concept, you may find, as I did, that you will want to use this form for all your 3D engine representations. However, I do have some transformation matrix algorithms available for Euler-quaternion conversion.
Search the Dr. Math Library:
Ask Dr. MathTM
© 1994- The Math Forum at NCTM. All rights reserved.