Bonsoir à tous, je me permets de vous faire part d'un problème qui ne m'était jamais apparu auparavant : La caméra tremble.
Je code un petit jeu en OpenGL où l'on conduit un TGV, j'utilise l'axe des Z comme axe vertical et le train est initialement orienté dans la direction de X, ainsi que la caméra. Lorsque l'on active la vue en cabine, le calcul de la position de la caméra connaissant celle du train ainsi que l'orientation de ce dernier se fait de cette façon :
A = xTrain + 7 * cos(angleTrain)
B = yTrain + 7 * sin(angleTrain)
xCam = A - 0.5*sin(angleTrain)
yCam = B + 0.5*cos(angleTrain)
Voici un schéma explicatif :
Pour calculer la position de la cible de la caméra, je prends comme distance 900 (Par exemple) et je procède ainsi :
xCible = xCam + 900 * cos(angleCam + angleTrain)
yCible = yCam + 900 * sin(angleCam + angleTrain)
Un autre schéma pour expliquer :
Lorsque je teste, je me rends compte que la caméra tremble dès que la somme (angleCam + angleTrain) a une valeur différente de 0, 90, 180 ou 270° ! J'ai toujours géré la caméra de cette façon et je n'ai jamais eu ce problème.
Voici le code résumé du main:
Et celui de la fonction gestionCam() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 int main(int argc,char *argv[]) { SDL_Surface *ecran; SDL_Event evenement; if(SDL_Init(SDL_INIT_VIDEO)!=0) //Initialisation mode vidéo SDL return -1; SDL_WM_SetCaption("TGV Driving",NULL); putenv("SDL_VIDEO_CENTERED=1"); ecran=SDL_SetVideoMode(800,600,32,SDL_OPENGL); //Fenêtre SDL glMatrixMode(GL_PROJECTION); //Appel matrice de projection glLoadIdentity(); gluPerspective(70,4.0/3,0.1,1000); glEnable(GL_TEXTURE_2D); //Initialisations texturing et Z-buffer glEnable(GL_DEPTH_TEST); //Chargement textures et initialisations paramètres while(1) //BOUCLE PRINCIPALE { SDL_PollEvent(&evenement); if(evenement.type==SDL_QUIT) break; if(evenement.type==SDL_KEYDOWN) { ... } CommandeTrain(&infos); //Mouvement du train gestionCam(&infos,evenementCam); //Gestion de la caméra Dessiner(&infos); //Dessin 3D glFlush(); SDL_GL_SwapBuffers(); } SDL_Quit(); return 0; }
ptr est un pointeur sur une structure contenant les différents paramètres, vuesCam[] est un tableau de structures qui contiennent les coordonnées de A et B (xRepere1 et yRepere1) ainsi que celles de la caméra (x et y) et celles de la cible de la caméra (xCible et yCible), ainsi que l'orientation de la caméra par rapport au train (angle). convoi[] est un tableau de structures représentant les différents trains, chaque case de ce tableau contient un tableau de structures appelé voitures[] (La motrice et les wagons) contenant entre autres l'orientation de la voiture de train).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void gestionCam(Principale *ptr) { ptr->vuesCam[1].xRepere1=ptr->convoi[ptr->numTrain].voitures[0].x+7*cos(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180); //Calcul A et B ptr->vuesCam[1].yRepere1=ptr->convoi[ptr->numTrain].voitures[0].y+7*sin(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180); ptr->vuesCam[1].x=ptr->vuesCam[1].xRepere1-0.5*sin(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180); //Calcul xCam et yCam ptr->vuesCam[1].y=ptr->vuesCam[1].yRepere1+0.5*cos(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180); ptr->vuesCam[1].xCible=ptr->vuesCam[1].x+900*cos((ptr->convoi[ptr->numTrain].voitures[0].angle+ptr->vuesCam[1].angle)*M_PI/180); //Calcul xCible et yCible ptr->vuesCam[1].yCible=ptr->vuesCam[1].y+900*sin((ptr->convoi[ptr->numTrain].voitures[0].angle+ptr->vuesCam[1].angle)*M_PI/180); }
Je n'arrive pas au bout de ce problème, j'y ai passé tout l'après-midi, auriez-vous une solution svp ??
Partager