[gameprogrammer] Re: Rotation, Rotation, Rotation...

  • From: "richard sabbarton" <richard.sabbarton@xxxxxxxxx>
  • To: gameprogrammer@xxxxxxxxxxxxx
  • Date: Tue, 18 Mar 2008 19:29:15 +0000

Hi Vince,

This is exactly the issue.  I want x and y movement of the mouse to
control rotation in free 360 deg on all axis.  Gimbal Lock is an issue
and following some additional reading I think I can do it.  Also, I
think I can stop short of using Quarternians to do it.

My plan is this...

Define my camera orientation as two vectors, Direction (vD) and Up
(vU), with a 3rd vector at 0,0,0 (vO) for the origin.  I can then use
gluLookAt to set the camera.

With these 3 vectors I can rotate my camera in any way without
suffering from gimbal lock.

For Left/Right rotation I can rotate vD around the axis defined by vU.
 Roll rotation I can rotate vU around the axis defined by vD.  For
up/down rotation I will rotate vD around the Cross Product of the
vectors vU vD.

I haven't done this yet but I think it works in theory.  What I need
to do is put together an efficient routing to rotate a vector around
an arbitrary axis.  The glRotatef() function does eactly this but my
problem is that I am going to need the vectors so I think I will need
to code this myself.

Richard


On 18/03/2008, Vince <uberneen@xxxxxxxxx> wrote:
> --- richard sabbarton <richard.sabbarton@xxxxxxxxx>
> wrote:
>
> > Hi Robbert,
> >
> > I have been looking into this a bit further and I
> > think I can describe
> > the problem a little better. (maybe)...
> >
> > OK.  What I want is to be able to rotate my Player
> > view around my
> > players axis and not the global axis.  So, if my
> > player starts out, as
> > is default, looking down the Z Axis and then looks
> > down I want my
> > players Z axis to point down so that a rotation
> > around my players axis
> > are relative to the player and not the global axis.
> >
> > Lets say my control keys are up,down,left and right.
> >  If my player
> > pushes down by 90 deg and then pushes left by 90 deg
> > I want my player
> > to now be on its side looking 90 deg to the left of
> > its original
> > position.
> >
> > Currently, pushing down for 90 deg looks down but
> > then the left action
> > rotates the view and I am still looking down.
> >
> > I read the Quaternion Camera tutorial that Vince
> > sent through (Thanks
> > Vince) but I don't think I really understood it.  It
> > has
> > copy/paste'able code that I think would do exactly
> > what I want but I
> > would prefer to do something I understand.  Also, I
> > will need the same
> > functionality for objects in my world as well and I
> > am not sure, given
> > the calculations involved, that this is going to run
> > quick enough.
> >
> > I have been looking into rotation matrices and
> > transforms as well.
> >
> > One thing has certainly become clear... My Math is
> > letting me down.  I
> > have a feeling the answer to my problem lies in a
> > trip to the bookshop
> > for some Math Texts and a large supply of sugary
> > snacks and caffeine
> > based drinks.
> >
> > The thing is, there are tons of tutorials out there
> > that explain how
> > to do this.  The problem is that they all seem to
> > assume a certain
> > ammount of knowledge on the subject before they
> > begin.  Again, back to
> > the Math Texts...
> >
> > Richard
>
>
> This is the FPS camera that I've implemented in my
> testing framework.
>
> I track xpos, ypos, zpos, xrot, yrot, and zrot.
> I also have storage for lastx and lasty, but that
> applies to mouse movement so it's not absolutely
> necessary.
>
> This is just my sloppy testing framework, so I don't
> do things like compute for timescale.  You might
> normally replace the multiplication by 0.5 to a value
> determined by your frame loop.
>
> When you press
> 'Forward'
>
> yrotrad = (yrot / 180 * PI);
> xrotrad = (xrot / 180 * PI);
> xpos += (float) sin(yrotrad) * 0.5;
> zpos -= (float) cos(yrotrad) * 0.5;
> ypos -= (float) sin(xrotrad) * 0.5;
>
> 'Backward'
>
> yrotrad = (yrot / 180 * PI);
> xrotrad = (xrot / 180 * PI);
> xpos -= (float) sin(yrotrad) * 0.5;
> zpos += (float) cos(yrotrad) * 0.5;
> ypos += (float) sin(xrotrad) * 0.5;
>
> 'Left'
>
> yrotrad = (yrot / 180 * PI);
> xpos += (float) cos(yrotrad) * 0.5;
> zpos += (float) sin(yrotrad) * 0.5;
>
> 'Right'
>
> yrotrad = (yrot / 180 * PI);
> xpos -= (float) cos(yrotrad) * 0.5;
> zpos -= (float) sin(yrotrad) * 0.5;
>
> I handle rotation through the mouse, but this could be
> handled any way that you want.
> My function takes x and y, which represent the current
> mouse position.  Since I'm using GLFW, it's not
> constrained to the screen size.
>
> diffx=x-lastx;
> diffy=y-lasty;
> lastx=x;
> lasty=y;
> xrot += (float) diffy * 0.2;
> yrot += (float) diffx * 0.2;
>
> if(xrot > 360) { xrot -= 360; }
> if(xrot < 0) { xrot += 360; }
>
> if(yrot > 360) { yrot -= 360; }
> if(yrot < 0) { yrot += 360; }
>
> When I draw, I first translate to the player position
> using a camera() function.
>
> glRotatef(xrot,1.0,0.0,0.0);
> glRotatef(yrot,0.0,1.0,0.0);
> glTranslated(-xpos,-ypos,-zpos);
>
> So my display function is abstractly
>
> init();
> camera();
> draw();
>
> From what I've read, this is a pretty common FPS
> camera, except when moving forward, you move along the
> vector that you're looking down, instead of moving
> forward along terrain while looking up.
>
> If your range of movement is FPS style, along some
> kind of terrain, this should do what you want, but if
> it's more like a flight or space simulator, you'll run
> into Gimbal lock, and that's where you could
> potentially use quaternions.
>
> My knowledge of quaternions isn't that great, which is
> why I haven't implemented them yet.  Like you, I want
> to know more about what I'm doing with them rather
> than copy and paste, but I figure dissecting an
> existing class is a good place to begin.
>
> Vince~
>
>
>      
> ____________________________________________________________________________________
> Never miss a thing.  Make Yahoo your home page.
> http://www.yahoo.com/r/hs
>
> ---------------------
> To unsubscribe go to http://gameprogrammer.com/mailinglist.html
>
>
>

---------------------
To unsubscribe go to http://gameprogrammer.com/mailinglist.html


Other related posts: