cs_Chouchou182
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011
1
30 juil. 2004 à 10:42
Salut
J'ai effectivement écrit une grosse bétise. glPushMatrix() ne modifie pas la matrice active.
Pourtant les modifications que j'ai apportées, à savoir le constructeur par défaut et un nouvel appel à gluLookAt() ont fait marcher l'application. C'est pourquoi j'ai voulu expliquer le pourquoi de la réussite.
Or mon explication était erronée mais mes modifications fonctionnaient (et je ne sais toujours pas pourquoi).
Personnellement je n'utilise pas gluLookAt() mais une composition de translations et rotations (ce qui revient au final au même) mais ainsi je sais quelles transformations j'applique à ma scène.
J'ai vu ta correction et je pense que tes calculs pour récupérer Z et faire une translation supplémentaire ne doivent pas être. Imagine quand ta caméra bougera dans les trois coordonnées de l'espace.
Une petite amélioration : remplace
if(scaled==0)
scaled=1;
else if(scaled==1)
scaled=0;
par :
scaled = 1 - scaled ;
Un petit exemple en C aui gère une caméra
#include <GL/glut.h>
#include <stdio.h>
#pragma comment (lib, "opengl32")
#pragma comment (lib, "glut32")
struct Camera
{
float x, y, z ;
} camera ;
static float spin = 0.0f ;
void ComputeCamera()
{
glTranslatef(camera.x, camera.y, camera.z) ;
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity() ;
ComputeCamera() ;
glRotatef(spin, 0.0f, 1.0f, 0.0f) ;
glutWireSphere(1.0f, 20, 16) ;
glFlush ();
}
void init (void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST) ;
glColor3f(1.0f, 0.0f, 0.0f) ;
camera.x = 0.0f ;
camera.y = 0.0f ;
camera.z = -10.0f ;
}
void Reshape(int w, int h)
{
glViewport(0, 0, w, h) ;
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 10.0f) ;
glMatrixMode(GL_MODELVIEW) ;
}
void keybord(unsigned char key, int i, int j )
{
switch ( key )
{
case 27:
exit(0) ;
break ;
case 'R':
case 'r':
spin+=10.0f ;
break ;
case 'x':
camera.x += 1.0f ;
break ;
case 'X':
camera.x -= 1.0f ;
break ;
case 'y':
camera.y += 1.0f ;
break ;
case 'Y':
camera.y -= 1.0f ;
break ;
case 'z':
camera.z += 1.0f ;
break ;
case 'Z':
camera.z -= 1.0f ;
break ;
}
printf("x : %3.1f, y : %3.1f, z : %3.1f\n", camera.x, camera.y, camera.z) ;
glutPostRedisplay() ;
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
init ();
glutDisplayFunc(display);
glutReshapeFunc(Reshape) ;
glutKeyboardFunc(keybord) ;
glutMainLoop();
return 0;
}