Rotating objects globally

Started by
3 comments, last by Geometrian 15 years, 7 months ago
Okay, I'm a pretty big newbie to 3D graphics, I really only picked up OpenGL so that I could shift the graphics for my game from isometric hand-drawn sprites to a rendered scene. So when it comes to three dimensional trig and matrix manipulation, I'm still picking it all up. The problem I'm having is with rotating objects relative to how the camera is seeing them. At present I'm just using basic glTranslate and glRotate functions to position the camera before drawing objects; with global variables keeping track of how far to rotate. That's all fine, except when I then rotate an object, it rotates around it own axes. I understand that's how it's supposed to work, but it's now how I want it to work. I'm not sure how to explain what I do want, but here goes: I want to my drawn scene (which is effectively a cube-shaped room with some walls cut away, so I'll call it a cube), I want it to rotate how it would if you held it in your hands. When you hold a cube in your hands and think about rotating around the x axis, you tilt the object up and down, then if you think about rotating around the y axis, you turn it left and right - regardless of how far you rotated it up and down. Basically what I want is that when the user presses left or right to rotate, it spins the entire model left or right according to how the model is currently viewed, rather than according to its own y axis, which may or may not have been moved by previous rotations. I've thought about using gluLookAt and calculating the eye position according as if it were a camera floating around the scene, but the problem with this is that when I rotate around the scene left or right (from the camera's perspective) it rotates around a horizontal slice of theoretical sphere it's on, rather than rotating relative to angle its viewing at. I've read a few articles dealing with cameras and rotation, but most seem to deal with first person views or third person cameras that only need to rotate around the target on one plane with minor elevation changes. tl;dr: How do I spin a cube relative to the camera's view, rather than the cube's own co-ordinates?
Advertisement
So, the issue here is to figure out how to rotate a cube in the world space rather than in its coordinate space?

Your method will depend on how you're drawing the cube.

If you are drawing the cube face by face, the solution will be:
Rotate the vertexes of the cube with matrices before you draw the polygons with them (warning, Python):
def MatrixMultiply(a,b):    ab = [[sum(i*j for i, j in zip(row, col)) for col in zip(*b)] for row in a]    return abdef Rotate(Point,Axis,Angle):    Angle = radians(Angle)    c = cos(Angle)    s = sin(Angle)    if Axis == "X":        RotationMatrix = [[ 1, 0, 0],                          [ 0, c, s],                          [ 0,-s, c]]    elif Axis == "Y":        RotationMatrix = [[ c, 0,-s],                          [ 0, 1, 0],                          [ s, 0, c]]    else: #Axis == "Z":        RotationMatrix = [[ c, s, 0],                          [-s, c, 0],                          [ 0, 0, 1]]    RotatedPoint = MatrixMultiply([Point],RotationMatrix)[0]    return RotatedPoint
Rotating each point by taking a point (x,y,z) and doing:
p1 = (x,y,z)p1 = Rotate(p1,"X",xangle)p1 = Rotate(p1,"Y",yangle)

All this is completely untested, so apologies if I've lead you astray...

G

[Edited by - Geometrian on September 20, 2008 11:58:12 PM]

[size="1"]And a Unix user said rm -rf *.* and all was null and void...|There's no place like 127.0.0.1|The Application "Programmer" has unexpectedly quit. An error of type A.M. has occurred.
[size="2"]

Here's the way to do it with matrices. In your header/initialization:
glLoadIdentity()RotationMatrix = glGetFloatv(GL_MODELVIEW_MATRIX)#Apply any translation to the object hereTranslationMatrix = glGetFloatv(GL_MODELVIEW_MATRIX)
In your input handler:
glLoadIdentity()#User applies any rotations here (use glRotate*() as you normally would).NewRotationsMatrix = glGetFloatv(GL_MODELVIEW_MATRIX)glLoadMatrixf(NewRotationsMatrix)glMultMatrixf(RotationMatrix)RotationMatrix = glGetFloatv(GL_MODELVIEW_MATRIX)
Finally, in your draw code:
glLoadMatrixf(TranslationMatrix)glMultMatrixf(RotationMatrix)#Draw object now

Hope this helps!
-G

[size="1"]And a Unix user said rm -rf *.* and all was null and void...|There's no place like 127.0.0.1|The Application "Programmer" has unexpectedly quit. An error of type A.M. has occurred.
[size="2"]

Thankyou! I used the second method of storing and loading matrices, and that works exactly how I want it to!
I thought it would :D
I had exactly the same problem a while ago, and, looking back on my thread, was able to get the solution that they had posed to me working--so this will be useful to me too!
Have a good one,
G

[size="1"]And a Unix user said rm -rf *.* and all was null and void...|There's no place like 127.0.0.1|The Application "Programmer" has unexpectedly quit. An error of type A.M. has occurred.
[size="2"]

This topic is closed to new replies.

Advertisement