2010-11-26 18 views
4

Hy, je suis en train d'essayer de faire un jeu à la première personne. Ce que j'ai pu faire était de faire bouger la caméra en utilisant la fonction gluLookAt(), et de la faire tourner avec glRotatef(). pour faire pivoter la caméra, puis avancer dans la direction sur laquelle j'ai tourné, mais les axes restent les mêmes, et même si j'ai tourné la caméra se déplace latéralement pas en avant. Est-ce que quelqu'un peut m'aider ? voici mon code:Comment faire pivoter puis se déplacer dans cette direction?

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(cameraPhi,1,0,0); 
glRotatef(cameraTheta,0,1,0); 
gluLookAt(move_camera.x,move_camera.y,move_camera.z,move_camera.x,move_camera.y,move_camera.z-10,0,1,0); 
drawSkybox2d(treeTexture); 
+1

Vous pouvez trouver ce site plus utile: http://gamedev.stackexchange.com/ –

Répondre

5

Cela nécessite un peu de mathématiques vecteur ...

Compte tenu de ces fonctions, l'opération est assez simple si:

vec rotx(vec v, double a) 
{ 
    return vec(v.x, v.y*cos(a) - v.z*sin(a), v.y*sin(a) + v.z*cos(a)); 
} 

vec roty(vec v, double a) 
{ 
    return vec(v.x*cos(a) + v.z*sin(a), v.y, -v.x*sin(a) + v.z*cos(a)); 
} 

vec rotz(vec v, double a) 
{ 
    return vec(v.x*cos(a) - v.y*sin(a), v.x*sin(a) + v.y*cos(a), v.z); 
} 

En supposant que vous avez un vecteur d'orientation définie comme {CameraPhi, CameraTheta, 0.0 }, alors si vous voulez déplacer la caméra dans la direction d'un vecteur v par rapport à l'axe de la caméra, vous ajoutez ceci à la position de l'appareil photo p:

p += v.x*roty(rotx(vec(1.0, 0.0, 0.0), CameraPhi), CameraTheta) + 
    v.y*roty(rotx(vec(0.0, 1.0, 0.0), CameraPhi), CameraTheta) + 
    v.z*roty(rotx(vec(0.0, 0.0, 1.0), CameraPhi), CameraTheta); 

une d qui devrait le faire. Gardez Coding :)

1

gluLookAt est défini comme suit:

void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, 
       GLdouble centerX, GLdouble centerY, GLdouble centerZ, 
       GLdouble upX, GLdouble upY, GLdouble upZ 
      ); 

La caméra est située à la position eye et en regardant dans la direction du eye au center.

eye et center définissent ensemble l'axe (direction) de la caméra, et le troisième vecteur up définit la rotation autour de cet axe.

Vous n'avez pas besoin des rotations phi et thêta séparées, il suffit de passer dans le vecteur up pour obtenir la rotation désirée. (0,1,0) signifie que la caméra est en position verticale, (0,-1,0) signifie que la caméra est à l'envers et que d'autres vecteurs définissent des positions intermédiaires.

+0

Ils ne sont pas les mêmes dans son code, regardez attentivement, il soustrait 10 de 'centerZ'. – ybungalobill

+0

@ybungalobill: Merci, j'ai supprimé cette partie. – casablanca