Jump to content
  • Advertisement
Sign in to follow this  
Sorbus111

OpenGL Rotating objects globally

This topic is 3592 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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?

Share this post


Link to post
Share on other sites
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 ab
def 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]

Share this post


Link to post
Share on other sites
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 here
TranslationMatrix = 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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!