by: cprogramming.com
Rotations in Three Dimensions
Part Three: Rotation About an Arbitrary Axis
Written by: Confuted, with a cameo bySilvercord (Charles Thibualt)
The previous method of doing the rotationsis called usingEuler angles. It's probably the simplest way of doing rotations,but ithas some problems. The biggest problem is called gimballock. Youmay or may not have already encountered this if you wrote codeaccording to thelast tutorial. If you encountered it and noticed it, withoutknowing whatit was, you may have spent hours trying to figure out where you wentwrong inyour code, carefully comparing every line of your code to the tutorial,tryingto find the difference. If that happened, I'm sorry. Thereisnothing wrong with your code; there is something wrong with themath. Ifyou'll recall, I told you two very important things, which you probablydidn'tconnect in the last tutorial. 1) Matrix multiplication is notcommutative. A*B != B*A. 2) We generated matRotationTotalby doing matRotationX * matRotationY* matRotationZ. If therewas nothing wrong with the math, you should have been able to do matRotationY*matRotationZ*matRotationX,or any other order, and gotten exactly the same results. But youwouldn't. This problem is the root cause of gimbal lock. Trying tovisualize this might blow your mind, so if you don't understand thenextparagraph, don't worry too much. Just remember that Gimbal Lockhappenswhen one axis gets rotated before another axis, and the axes are nolongermutually perpendicular. It can be a large problem, or it can gounnoticed, depending on the application.
We multiplied our matrices in the ordermatRotationX * matRotationY *matRotationZ. It seemed to work, and for the most part, itdid. But if you think about it carefully, you'll realize that, as you movean objectin 3d space, all three axes change at once. They remain mutuallyperpendicular to one another. In the program, however, we'rerotating theobject over the X-axis first. That rotates the Y andZ-axes. Thenwe rotate over the Y axis, but since we've already rotated over theX-axis, therotation on the Y-axis only changes the location of the Z-axis. Therotation of the Z-axis does not change the location of either of theother twoaxes. Huge problem if you need to rotate on all three axes,because oneaxis can literally end up on top of another axis! (Just in themath. It can't do that in real life, meaning our representationis notaccurate)
Luckily for you, many math geniuses have dealt with this problem. Therewas a famous man named Euler, whom you'll hear mentioned inCalculus. Hedetermined that any series of rotations in three dimensional space canberepresented as a single rotation over an arbitrary axis. For thisrepresentation, called angle/axis representation, you'll need to storethearbitrary axis about which you are rotating, and the amount by whichyou arerotating.
Now for the cameo by Charles, who was kind enough to write thefollowingsection for me:
Arbitraryaxis rotation by Charles Thibault
I am going to describe the calculations I perform in order to performrotationsabout an arbitrary axis. These calculations are NOT the matrixform ofthe rotations. Up to this point you know you can combine matricesinto asingle transformation. The single transformation matrix involvesabout 29multiplication operations and 9 addition operations, whereas completelyrotating a vector using my transformations (meaning calling myRotateVectorfunction TWICE, once over the Y axis then once over the Strafe vector)entailsabout ten percent more multiplications and about twice as many additionoperations (32 multiplications for two RotateVector calls, and 18additionoperations for two RotateVector calls).
How do you actually perform a rotation about an arbitrary axis? Wellfirstly you must understand rotations in two dimensions, because theconceptstays the same on an arbitrary plane. I'm going to make this asshort andsweet as possible. Instead of rotating the X and Y components ofavector, the X is really the component of the vector you are trying torotatePerpendicular to the vector that is the normal to the plane. Likewise theY is really the cross product between the vector you are trying torotate aboutand the actual vector being rotated.
Steps to rotate a vector:
-Calculate the Perpendicular component, multiply it by the cosine ofthe angleyou are trying to rotate through
-Calculate the cross product between the vector you are trying torotate aboutand the vector you are rotating, multiply it by the sine of the angle
-Add the results together
-Add the component of the vector you are trying to rotate that isparallel tothe vector you are rotating about
Note it is not totally necessary to calculate the parallel component ifthevector you are rotating and the vector you are rotating about arealreadyorthogonal. I do it in all cases anyway to avoid any mishaps andmakesure it is mathematically correct, but it seems to work bothways. Plus,by leaving it in the code you can rotate vector A about vector P evenif A andP are not orthogonal. (orthogonal means mutually perpendicular tooneanother)
ContactSilvercord onCProgramming.com if you have questions about that section. Therest ofthis will, once again, be written by me (Confuted).
There's still the problem of performing the actual rotation about yourarbitrary axis. Luckily, this can also be done with amatrix. Again, I'm not going to derive it, I'm going to spoon feed it toyou. You can thank me later.
| LeftHanded * | RightHanded * |
| tX2 + c | tXY - sZ | tXZ + sY | 0 | | tXY+SZ | tY2 + c | tYZ - sX | 0 | | tXZ - sY | tYZ + sX | tZ2 + c | 0 | | 0 | 0 | 0 | 1 | | | X2 + c | tXY + sZ | tXZ - sY | 0 | | tXY-sZ | tY2 + c | tYZ + sX | 0 | | tXY + sY | tYZ - sX | tZ2 + c | 0 | | 0 | 0 | 0 | 1 | |
Wherec = cos (theta), s = sin (theta), t = 1-cos (theta), and <X,Y,Z>is theunit vector representing the arbitary axis
Now, you can replace matRotationTotal with thismatrix, and completely eliminate matRotationX, matRotationY, and matRotationZ. Of course, there is extra math involved elsewhere. But by usingtheaxis/angle representation for your rotations, it is possible to avoidgimballock. However, it's also possible to still suffer from it, if youdosomething incorrectly. In the next tutorial, I'll talk about someof theuses for the things I've been saying, and after that, brace yourselffor theexciting and strange world of quaternions. If you don't have aheadachefrom thinking too much yet, you probably will after the quaternions.
| DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware. |
More Web Development Articles
More By Developer Shed
developerWorks - FREE Tools! |
David Barnes, Lead Evangelist for IBM Emerging Internet Technologies will discuss aspects of Web 2.0 that bring value to corporations, academia, and government. He'll also discuss IBM's vision around Web 2.0, including the importance of remixability and consumability. The discussion will culminate with examples of various IBM Software Group solutions you can use to get ahead of the Web 2.0 adoption curve. FREE! Go There Now!
|
|
|
|
Effective governance for lean development isn’t about command and control. Instead, the focus is on enabling the right behaviors and practices through collaborative and supportive techniques. Hear from Scott Ambler on how it is far more effective to motivate people to do the right thing than it is to force them to do so. Learn how to form a lightweight, collaboration-based framework that reflects the realities of modern IT organizations. FREE! Go There Now!
|
|
|
|
This whitepaper presents the benefits of successfully introducing static analysis into your organization using IBM Rational Software Analyzer. Additionally, it identifies some common pitfalls that can hinder the effective use of static analysis tooling as well as presents 10 simple strategies designed to help you quickly realize the value of static analysis using Rational Software Analyzer. FREE! Go There Now!
|
|
|
|
Learn how you can extend modern application lifecycle management to IBM System z through the IBM Rational Software Delivery Platform (SDP). The Did you say mainframe? e-kit includes podcasts, webcasts, tutorials, white and red papers, demos, and articles designed to help ease the challenges of modernizing your enterprise. This complimentary kit for mainframe developers is a practical, how-to guide for making the most of an existing development environment, including the skills and infrastructure already in place at an established enterprise. FREE! Go There Now!
|
|
|
|
Visit IBM developerWorks to download IBM DB2 Express-C 9.5, a no-charge version of DB2 Express 9 database server. DB2 Express-C offers the same core data server base features as other DB2 Express editions and provides a solid base to build and deploy applications developed using C/C++, Java, .NET, PHP, and other programming languages. FREE! Go There Now!
|
|
|
|
Download a free trial version of IBM Rational Developer for System i V7.1, which provides a complete development environment for traditional i5/OS application development. IBM Rational Developer for System i is a new eclipse-based workstation offering for i5/OS application development that provides a comprehensive Integrated Development Environment for edit/compile/debug of traditional RPG/COBOL/C/C++ i5/OS applications. FREE! Go There Now!
|
|
|
|
Join this Rational Talks to You teleconference on November 29 at 1:00 pm ET to participate in an interactive discusssion with Grady Booch around architecture and reuse. Get your questions answered! FREE! Go There Now!
|
|
|
|
Informix Dynamic Server (IDS) Express Edition offers outstanding online transaction processing (OLTP) database performance, while helping to simplify and automate many of the tasks associated with deploying databases for small business applications. IDS 11 further extends the ease of management and applications integration with the Admin API and Scheduler, high availability with Continuous Log Restore for backup server recovery in case of a primary server failure, and column level encryption to protect personal and company private data. FREE! Go There Now!
|
|
|
|
Try the latest version of IBM Rational Manual Tester V7.0.1 by downloading a free trial from IBM developerWorks. This manual test authoring and execution tool promotes test step reuse to reduce the impact of software change on testers and business analysts and addresses the needs of teams performing at least a portion of their testing manually. FREE! Go There Now!
|
|
|
|
The discipline of assembling and delivering software is maturing beyond standard developer-centric compile/test software builds. The end-to-end software development lifecycle is emerging as the new focus moves “Beyond the Build.” Join this on demand webcast to learn about methods for streamlining software delivery and key capabilities of the IBM Rational Build Forge framework for automating build and release management in environments of any size. FREE! Go There Now!
|
|
|
|
All FREE IBM® developerWorks Tools! |