2015-04-06 6 views
2

Je ne comprends pas ce que la fonction glLookAt() fait exactement.gluLookAt() ne cherche pas où il devrait

J'ai un objet à la position x, y, z. Je veux placer la caméra à la position x + 20, y + 20, z + 20 pendant que l'objet bouge, de manière à ce qu'il soit stationnaire. Cependant, ce n'est pas le cas: quand je fais le code suivant, je vois une croix qui se déplace lentement vers la droite et qui sort même de la fenêtre!

while (keystate[SDLK_ESCAPE] == false) { 

SDL_PollEvent(&event); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

n+=0.1; 
float x = 10; 
float y = 10+n*n; 
float z = 10; 

// drawing an object at x,y,z (here a cross) 
glBegin(GL_LINES); 
glColor3ub(200,0,0); 
glVertex3f(x-2,y,z); 
glVertex3f(x+2,y,z); 
glVertex3f(x,y-2,z); 
glVertex3f(x,y+2,z); 
glEnd(); 

// looking at the object 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(x+20,y+20,z+20,x,y,z,0,0,1); 

glFlush(); 
SDL_GL_SwapBuffers(); 

} 

Si l'appareil photo regardait correctement x, y, z, la croix devrait toujours apparaître au centre?

Si je mets y = 10 + n, l'objet semble immobile. Avec y = 10 + n * n, l'objet se déplace à vitesse constante, et avec y = 10 + n * n * n, l'objet se déplace et accélère.

J'ai aussi

gluPerspective(70,(double)640/480,1,1000); 

au début de mon code.

Merci d'avance! : S

Répondre

2

OpenGL est une machine d'état, pas une bibliothèque de graphes de scène. Il ne se souvient pas des objets que vous avez dessinés. Avec votre code, vous dessinez d'abord l'objet (avec toutes les matrices en cours), et ensuite, définissez la nouvelle matrice de vue. Cela n'aura aucun effet sur l'objet déjà dessiné pendant ce cadre. Lorsque le code ci-dessus est exécuté en boucle, la caméra regarde toujours la position de l'objet à partir de la dernière image, et plus votre objet bouge rapidement, plus il s'éloigne de la caméra.

Définissez les matrices avant vous dessinez l'objet.