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