View Full Version : "Freelok" in 3D space.

zenon

02-24-2003, 10:34 AM

Well.. as some of you maybe have noticed, I'm doing a 3D village. And things have gone quite good so far (expect for some minor problems). But.. I've aquired the following description of how to do a gluLookAt() movement.

-----------

camera location: cx,cy,cz

then the target should be:

tx=cx+sin(yrot)*sin(xrot)

ty=cy+cos(yrot)*sin(xrot)

tz=cz+cos(xrot)

where xrot is the rotation on the x axis

and yrot is the rotation on the y axis.

----------------

Now to the problem.. I've been trying to use and implement these calculations. But the thing won't work. Well honestly I don't know HOW to use it.

I just copied the structure into the code

and used WM_CHAR for key movement where I tried to use the formulas.. but NO.

Can someone that knows how to do good cameramovement (turning on the spot) help me?

Maybe explain how to use the formula, or even better.. give me another formula and explain it?

Thanks//zen.

shinpaughp

02-24-2003, 12:34 PM

It would probably be easier just to use glRotate and glTranslate rather than moving the camera.

glRotate(xrot, 1.0, 0.0, 0.0);

glRotate(yrot, 0.0, 1.0, 0.0);

glTranslate(cx, cy, cz);

[This message has been edited by shinpaughp (edited 02-24-2003).]

yeah, it's better to leave your position on

(0,0,0) an only transform and rotate or translate the enviroment.

zenon

02-24-2003, 10:07 PM

Well.. but I want to be able to move around

in my village. that's kind of the point.

I'm already using rotation, and it just isn't the same thing!

Help!

chxfryer

02-24-2003, 10:23 PM

Check out www.gametutorials.com (http://www.gametutorials.com) for some great camera tuts..

edit: Rotation should give your the same results as far as I know. glulookat will just take your position and look vectors and translate/rotate the world around the camera. Plus later on when you try to push your game/app/etc to the limits, those extra (co)sins wont help too much.

[This message has been edited by chxfryer (edited 02-24-2003).]

zenon

02-25-2003, 01:06 PM

Well.. the main reason to why I don't want

to use just plain rotation on the movement

is that when rotating, the whole world rotates.. right? Then I often get "stuck" inside a house that was lying in the path of the rotation.. And quite frankly. I want to be the one rotating, NOT the whole world.

Jambolo

02-26-2003, 12:42 AM

gluLookAt is really cumbersome for a camera system. You should use glRotate and glTranslate.

Translating/rotating the camera is exactly the same as translating/rotating the world, except the signs are opposite and the origins are different. If it isn't working right, first try switching the order of the rotate and translate, then try negating the x, y, z and rotation values.

mikael_aronsson

02-26-2003, 01:02 AM

Hi !

I think there is a misunderstanding of some form here, you can't move the "camera" in OpenGL, you always transform the world around a fixed viewer, that's how OpenGL works, if you use glRotate/glTranslate or gluLookAt does not matter then end result is the same.

Mikael

darkbyte

02-26-2003, 03:53 PM

I agree that *maybe* you should use glRotate and glTranslate... but if you're not quite comfortable with that and you want to experiment you can try calculating the coords using the rotation and translation matrices or quaternions...

The rotation matrices (if I remember right) are:

rotation around x:

| 1 0 0 0 |

| 0 cos@ -sin@ 0 |

| 0 sin@ cos@ 0 |

| 0 0 0 1 |

rotation around y:

| cos@ 0 sin@ 0 |

| 0 1 0 0 |

|-sin@ 0 cos@ 0 |

| 0 0 0 1 |

rotation around z:

| cos@ -sin@ 0 0 |

| sin@ cos@ 0 0 |

| 0 0 1 0 |

| 0 0 0 1 |

The translation matrix is:

| 1 0 0 dx |

| 0 1 0 dy |

| 0 0 1 dz |

| 0 0 0 1 |

You would concatenate the rotation/translation matrices needed...

To use the a rotation matrix your code would look like:

angle (converted to radians):

GLfloat yaw = yrot*(PI/180.0f);

Calculate the sin/cos only once:

GLfloat sinY = sinf(yaw);

GLfloat cosY = cosf(yaw);

camera location: cx,cy,cz

Rotating around y:

tx=(cx*cosY)+(cz*sinY);

ty=cy;

tz=-(cx*sinY)+(cz*cosY);

zenon

02-27-2003, 12:34 AM

Okay then.. I'll try out your tips.

Thanks//Zen.

Powered by vBulletin® Version 4.2.2 Copyright © 2014 vBulletin Solutions, Inc. All rights reserved.