Sign in to follow this  
BinaryAlgorithm

OpenGL 3D Rotations and avoiding Gimble Lock

Recommended Posts

I have been having some difficulty with understanding OpenGL rotations; so far the only coordinate system that makes sense to me for rotation is the spherical coordinate system since every point in a sphere can be reached with two types of rotation. Probably this is because I know enough to convert between this and normal XYZ vectors. However, this system doesn't allow me to accomplish what I need. What I am trying to do is cause a directional key stroke or mouse movement to rotate the viewport relative to itself so that no matter which way your are facing, left/right/up/down function the same way. Let's say we have a vector which represents the point on the surface of a sphere where we are looking at. When you LoadIdentity() in OpenGL tutorials an object at (0, 0, -10) is in front of you. It seems the default camera vector is (0, 0, -1), the up vector is (0, 1, 0), and the rotation is (0, 0, 0). As soon as you do any rotations, further rotations along x, y, or z axis no longer work properly (this is a common problem I think). Despite reading some articles on quaternions I can't make enough sense of it to use it. It doesn't seem to solve the underlying problem with rotating relative to the viewport because I still need the coordinates of left/right/up/down relative to the current 4D vector. Some of the confusion is between all these coordinate systems and their rotations; how does a 4D vector rotate? You still have to convert it to an XYZ rotation for OpenGL too. What's a good way to organize this? This is my first thought: 1) Make a Quat with the default camera view 2) Find the Quat representing the top/bottom/left/right of the current viewport 3) Move the Camera Quat towards this new Quat by a certain portion/speed 4) Convert the Quat to some XYZ rotation that OpenGL understands 5) Do the matrix transform then render objects 6) Go back to #2 A code sample that does this, or perhaps a better way to do it, would be appreciated. The underlying math isn't that hard once it's figured out, but it can be hard to conceptualize. [Update] Angle-Axis format is apparently the easier format to understand, and can be converted to quaternions and back. Using a combination of concepts from different sites, I was able to get relative motion working. I still need to find a way to return to a standardized plane, for instance "level off" the ship in a 3D space game. I used these pages as reference: http://www.cprogramming.com/tutorial/3d/quaternions.html http://www.gamedev.net/reference/articles/article1095.asp http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm [Edited by - BinaryAlgorithm on April 30, 2009 12:20:03 AM]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this